Проблема в том, что выражение property(evaluate)
связывает свойство с функцией evaluate
, которая находится в области видимости, когда выполняется тело класса для A
.Чтобы сделать то, что вы хотите, вам придется отложить доступ к evaluate
до тех пор, пока не будет использовано свойство.
Это сработает, но если бы мы знали, почему вы пытаетесь это сделать, вероятно, есть гораздо лучший способ:
class A():
def evaluate(self):
return 'A'
value = property(lambda self: self.evaluate())
class B(A):
def evaluate(self):
return 'B'
b = B()
print(b.value) # prints 'B'
Если все, что вам нужно, это вернуть другую константную строку для A
или B
, тогда вам вообще не нужно свойство:
class A():
value = 'A'
class B(A):
value = 'B'
b = B()
print(b.value)
иесли вам действительно нужно свойство, просто переопределите свойство в подклассе:
class A():
@property
def value(self):
return 'A'
class B(A):
@property
def value(self):
return 'B'
b = B()
print(b.value)