20

__init__で定義されたキーワード**kwargsがクラスに割り当てられるように定義できる方法はありますか?

たとえば、ValidationRuleクラスをで初期化する場合、可能なすべての kwarg に明示的に名前を付けることなくValidationRule(other='email')、 の値をクラスに追加する必要があります。self.other

class ValidationRule:
    def __init__(self, **kwargs):
        # code to assign **kwargs to .self
4

7 に答える 7

31

はスタックオーバーフローのどこかでそのような解決策を見たと思います。とにかく、次のようになります。

class ValidationRule:
    __allowed = ("other", "same", "different")
    def __init__(self, **kwargs):
        for k, v in kwargs.iteritems():
            assert( k in self.__class__.__allowed )
            setattr(self, k, v)

このクラスは、 にリストされているホワイトリストに登録された属性名を持つ引数のみを受け入れます__allowed

于 2010-03-29T05:35:55.530 に答える
20

これは最もクリーンな方法ではないかもしれませんが、うまくいきます:

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

利用可能なプロパティを制限して、入力が外部ソースから来たときに問題が発生しないようにするため、私は唯一のソリューションを好むと思います。

于 2010-03-29T05:39:49.067 に答える
12

次のようなことができます。

class ValidationRule:
   def __init__(self, **kwargs):
      for (k, v) in kwargs.items():
         setattr(self, k, v)
于 2010-03-29T05:25:08.343 に答える
4
class ValidationRule:
   def __init__(self, **kwargs):
      self.__dict__.update(kwargs)
于 2010-03-29T05:39:08.630 に答える
3

これは、更新するよりも優れていると見なすことができます__dict__:

class C:
    def __init__(self, **kwargs):
        vars(self).update(kwargs)

>>> c = C(a='a', b='b')
>>> c.a   # returns 'a'
>>> c.b   # returns 'b'
于 2015-10-28T12:18:24.543 に答える
3

インスタンスの属性をkwargs更新することで、引数を設定できます。__dict__

class ValidationRule:
   def __init__(self, **kwargs):
       self.__dict__.update(kwargs)
于 2010-03-29T05:40:21.890 に答える
0

上記の回答が役に立ち、洗練されたものであることがわかりました。

class MyObj(object):
    def __init__(self, key1=1, key2=2, key3=3):
        for (k, v) in locals().iteritems():
            if k != 'self':
                setattr(self, k, v)

テスト:

>>> myobj = MyObj(key1=0)
>>> print myobj.key1
0

また、検証もあります。

>>> myobj = MyObj(key4=4)
TypeError: __init__() got an unexpected keyword argument 'key4'
于 2012-01-17T21:45:43.420 に答える