Python New Styleクラス関連の質問
-
26-10-2019 - |
質問
私はPython学習者であり、現在はさまざまな数のフィールドを持つクラスをハッキングしています。 ここに「名前付きのものの束」の例.
class Bunch:
def __init__(self, **kwds):
self.__dict__.update(kwds)
また書きたいです __setattr__
このクラスでは、入力属性名を確認します。しかし Pythonドキュメント 言う、
__setattr __()がインスタンス属性に割り当てたい場合、「self.name = value」を単純に実行する必要はありません。これにより、再帰的な呼び出しが発生します。代わりに、インスタンス属性の辞書に値を挿入する必要があります。たとえば、「self .__ dict __ [名前] =値」。インスタンス辞書にアクセスするのではなく、新しいスタイルのクラスの場合、たとえば「オブジェクト.__ setattr __(self、name、value)」など、同じ名前のベースクラスメソッドを呼び出す必要があります。
その場合、私も使用する必要があります object.__dict__
の中に __init__
交換する機能 self.__dict__
?
解決
いいえ。クラスを次のように定義する必要があります class Bunch(object)
, 、しかし、継続し続けます self.__dict__
.
使用するだけです object.__setattr__
メソッドを定義している間 self.__setattr__
無限の再帰を防ぐ方法。 __dict__
メソッドではありませんが、オブジェクト自体の属性であるため、 object.__dict__
うまくいきません。
他のヒント
使用できます
class Bunch:
def __init__(self, **kwds):
self.__dict__.update(kwds)
def __setattr__(self, name, value):
#do your verification stuff
self.__dict__[name] = value
または新しいスタイルのクラスで:
class Bunch(object):
def __init__(self, **kwds):
self.__dict__.update(kwds)
def __setattr__(self, name, value):
#do your verification stuff
super(Bunch, self).__setattr__(name, value)
所属していません StackOverflow