2 番目のクラスで 2 回インスタンス化するカスタム クラスがあります。
[編集: 古いコードは私の問題を正確に捉えていませんでした。より明確にするために書き直しています。Foo はコールバック関数を使用してネットワーク イベントを処理します (複数の接続が必要なため、Bar には複数の Foo フィールドがあり、単に継承することはできません)。Bar クラスでは、コールバックを上書きして別のことをしたいと考えています。Foo で callb を書き換えても機能しません。他のインスタンスで継承しているためです]
class Foo(object):
def __init__(self, x):
self._x = x
#When an event happens, call callb()
self.on_certain_event(callback=callb)
def callb(self):
print self._x
def run(self):
waitForEventsInfinitely() #
class Bar(object):
def __init__(self):
self._foo = Foo(5)
#OVERWRITE THE EXISTING CALLBACK METHOD IN THE Foo CLASS!
self._foo.callb = self.callb
def callb(self):
print self._x * 10
def run(self):
waitForEventsInfinitely() # Not going to actually write t
f = Foo(2)
f.run()
b = Bar()
b.run()
[Foo で run() を呼び出すと、正しく動作します。ただし、Bar から Foo の callb メソッドを上書きすることはできません - Foo によって参照されるはずの self._x が Bar から呼び出されようとしています]
ただし、コードを実行すると、期待値 50 ではなく、「Bar には属性 '_x' がありません」というエラーが表示されます。明らかに、Bar のテストの自己は、実際にメソッドを呼び出している Foo ではなく、依然として Bar を参照しています。 . Bar の内部 Foo self._foo フィールドであると予想していました。
私の問題は名前マングリングと関係があると思われますが、メソッドが上書きされた自分自身のフィールドがある場合、説明的なソースを見つけることができませんでした。ほとんどの例は、別のクラスから継承しているときのようです。