У меня есть собственный класс, который я дважды создаю во втором классе:
[РЕДАКТИРОВАТЬ: старый код на самом деле не отражал мою проблему, я переписываю, чтобы было понятнее. Foo будет обрабатывать сетевые события (а мне нужно несколько подключений, поэтому Bar будет иметь несколько полей Foo и не может просто наследовать) с помощью функции обратного вызова. В классе Bar я хочу перезаписать обратный вызов, чтобы сделать что-то другое. Переписать callb в Foo не получится, потому что я наследую от него в других экземплярах]
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()
[Когда run () вызывается в Foo, он работает правильно. Однако я не могу перезаписать метод callb Foo из Bar - self._x, на который должен ссылаться Foo, пытается вызвать из Bar]
Однако при запуске кода я получаю ошибку «Бар не имеет атрибута '_x'», а не мое ожидаемое значение 50. Очевидно, что self в тесте Bar по-прежнему ссылается на Bar, а не на Foo, который фактически вызывает метод . Я ожидал, что это будет внутреннее поле Foo self._foo в Bar.
Я подозреваю, что моя проблема как-то связана с искажением имен, но мне не удалось найти описательный источник, когда у меня есть поля на себе, методы которых были перезаписаны. Похоже, что в большинстве случаев я наследую от другого класса.
print self._foo._x * 10
- person Wessie   schedule 09.04.2013Foo
отBar
? Похоже, вы пытаетесь имитировать наследование - почему бы просто не использовать наследование? - person cdhowie   schedule 09.04.2013__init
или__init__
? - person Xymostech   schedule 09.04.2013