Имам персонализиран клас, който инстанцирам два пъти във втори клас:
[РЕДАКТИРАНЕ: Старият код всъщност не улавя какъв е проблемът ми, пренаписвам го, за да го направя по-ясен. 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]
Въпреки това, когато стартирам кода, получавам грешката „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