Когда вы делаете class Derived(BaseKill)
, class Derived()
теперь "наследует" методы от class BaseKill
.
Включая foo()
и bar()
.
Однако у вас есть bar()
, определенный в class Derived()
, который имеет прецедент над "унаследованным bar()
"
В основном это похоже на следующее
class Derived():
def foo(self):
print('what is wrong with jpython')
return self.bar()
def bar(self):
print('I am bar')
self.foo()
self.hello()
def hello(self):
print('say Hi')
if __name__== '__main__':
print('what')
c = Derived()
c.bar()
Из этого кода вы можете ясно видеть, что bar()
вызывает foo()
, что, в свою очередь, вызывает bar()
снова. Это бесконечность / рекурсия.
Ошибка, которую вы видите, верна.
В исходном коде вы можете включить несколько операторов print
, чтобы получить имя класса, представленное self
, например print(self.__class__.__name__)
. Это поможет вам лучше понять наследование классов.
Возможно, вы захотите посмотреть @staticmethod
для BaseKill.bar()
, однако это изменит функциональность, поэтому убедитесь, что вы тщательно протестировали это, чтобы убедиться, что это то, что вам нужно:
class BaseKill():
def foo(self):
print('what is wrong with jpython')
return BaseKill.bar()
@staticmethod
def bar():
print('just chill bar')
return None
class Derived(BaseKill):
def bar(self):
print('I am bar')
self.foo()
self.hello()
def hello(self):
print('say Hi')
if __name__== '__main__':
print('what')
b=BaseKill()
b.foo()
c = Derived()
c.bar()
Подробнее о @staticmethod
здесь
В качестве альтернативы вы можете сделать следующее для foo()
in BaseKill
:
class BaseKill():
def foo(self):
print('what is wrong with jpython')
return BaseKill.bar(self)