__setattr__親を無視:Pythonの:次のコードを持つ
class Parent():
def __init__(self):
pass
def __setattr__(self, name, value):
raise RuntimeError()
class Child(Parent):
def __init__(self):
super().__init__()
self.y = 2
if __name__ == '__main__':
print(Child().y)
を、次の条件/仮定:新しい設定するときChild
を行い、その__setattr__
実装に何かが例外を発生させない
- クラス
Parent
クラス属性。 - クラス
Parent
ソースコードを変更することはできません(猿のパッチが当てられている可能性がありますが、外部の依存関係です)。
これを修正する方法はありますか? y
を設定する前に、Parent
の__setattr__
の実装を「ゴミ箱」にすることはできますか? Child
にこのメソッドを実装して、期待どおりに動作させることはできますか?これは完全ので、これをやってParent
の__setattr__
は、Parent
で様々な不変量を壊すかもしれないバイパスされていることを
object.__setattr__(self, 'y', 2)
注:
あなたは '' Child'クラスの__setattr__'をオーバーロードすることができます。 –
@hiroprotagonist:ええ、私は 'object .__ setattr__'を試しましたが、これはうまくいきませんでした。今私はそれと 'super(Parent、self).__ setattr__'の違いを知っています。 :-) – Peque
私は実際に私が答えとして投稿したものを意味しました。 'object'では' __setattr__'を呼び出さず、 'self'だけで呼び出します。これは、MROチェーンで定義されている可能性のあるすべての '__setattrs__'をバイパスします。 –