0

_init_関数がかなりの数のキーワード引数を必要とするクラスがあります。基本的にこのコードを書き直して、構文的にクリーンになるようにしたいと思います(ハードコーディングが少なくなります)。できれば、キーワード引数を_ init _に追加するだけで、null関数のすべての属性/引数がそれぞれ変更 されるように取得できるようにしたいと思います。

class Class :

    def __init__ (self, kw0=0, kw1=1, kw2=2) :

        ''' The keyword arguments as strings. '''
        self.Keys = ['kw0', 'kw1', 'kw2']

        ''' Their values. '''
        self.Values = [kw0, kw1, kw2]

        ''' A dictionary made from the keys and values. '''
        self.Dict = self.make_dict()

        ''' As individual attributes, '''
        self.KW0, self.KW1, self.KW2 = self.Values

    def make_dict (self) :
        ''' Makes a dictionary '''

        keys   = self.Keys
        values = self.Values

        _dict = {}
        for i in xrange(len(keys)) :
            key   = keys[i]
            value = values[i]

            _dict[key] = value

        return _dict

    def null (self, kw0=None, kw1=None, kw2=None) :
        ''' The same keyword arguments as **__init__** but they all default
            to **None**. '''

        pass

c = Class()
print c.Keys
print c.Values
print c.Dict
print c.KW0
print c.KW1
print c.KW2
4

2 に答える 2

3

これは私がPythonについて気に入っていることの1つです。あなたの中で__init__

def __init__ (self, **kwargs):
    self.__dict__.update(kwargs)

辞書で定義されたkwargsメンバーをクラスのメンバーとして追加します。

編集済み-**kwargsの適切な構文を反映し、append()の代わりにupdate()を使用する

于 2011-07-14T21:49:14.697 に答える
2

キーワード引数を受け入れないのはなぜですか。許可されるキーワード名とそのデフォルト値には、クラス属性を使用できます。

class Class(object):

     _defaults = dict(kw0=42, kw1=None, kw2=True, kw3="Ni!")

     def __init__(self, **kwargs):

        # Raise exception if any non-supported keywords supplied
        if set(kwargs.keys()) - set(self._defaults.keys()):
            raise KeyError("unsupported keyword argument")

        # Update our instance with defaults, then keyword args
        self.__dict__.update(self._defaults)
        self.__dict__.update(kwargs)

複数のメソッド(__init__()およびなどnull())で同じ機能が必要な場合は、引数処理コードを独自のメソッドに分割し、両方の場所から呼び出します。

1つの欠点はhelp()、他のPythonドキュメントツールでは、メソッドシグネチャに含まれていないため、許可されるキーワード引数が表示されないことです。

余談ですが、なぜキーと値を別々に保存しているのかよくわかりません。それらを辞書として保存し、辞書.keys()または.values()メソッドを使用して必要なときにキーまたは値を取得します。

于 2011-07-14T21:59:24.653 に答える