インスタンス属性がその値を変更するたびに別の関数を呼び出すため、__setattr__
のPythonクラスのメソッドをオーバーライドしようとしています。これまでのところ、私は、実行時に__setattr__
を上書きせずに、このソリューションを持っている実行時に__setattr__を無効にする
:
この初期化時に、私は、後に使用されようとしているいくつかの属性を設定しているのでしかし、私は、__init__
方法でこの動作をしたくありません私はで試してみました
class Foo(object):
def __init__(self, a, b):
self.a = a
self.b = b
result = self.process(a)
for key, value in result.items():
setattr(self, key, value)
# override self.__setattr__ here
def aux(self, name, value):
print(self.b)
object.__setattr__(self, name, value)
:
class Foo(object):
def __init__(self, a, host):
object.__setattr__(self, 'a', a)
object.__setattr__(self, 'b', b)
result = self.process(a)
for key, value in result.items():
object.__setattr__(self, key, value)
def __setattr__(self, name, value):
print(self.b) # Call to a function using self.b
object.__setattr__(self, name, value)
しかし、私はこれらのobject.__setattr__(...)
を避け、__init__
メソッドの最後に__setattr__
を上書きしたいと思いますおよびobject.__setitem__['__setitem__'] = self.aux
がありますが、これらのアテンプのどれも効果がありません。私はthis section of the data model referenceを読んだが、それは自分自身の割り当てのように見える__setattr__
は少しトリッキーです。
どう__init__
の終わりに__setattr__
を上書きすることは可能かもしれない、あるいは少なくとも__setattr__
のみコンストラクタで通常の方法で呼び出された神託のソリューションがありますか?
ワウ!ちょうどうわー。私はこれを見つけ出し、それをほぼ破棄しましたが、それはまさに私が同様の問題を解決するために必要なものです。この答えで深刻なPythonの魔法。申し訳ありません100回upvoteできません:p – velis