Я создаю члены, используя функцию свойства, но когда я пытаюсь переопределить методы задания и получения этих свойств, он всегда ссылается на методы задания и получения родительского класса:
class A():
def evaluate(self):
return 'A'
value = property(evaluate)
class B(A):
def evaluate(self):
return 'B'
b = B()
print(b.value) # I get 'A'
Я попытался поместить определение члена значения внутри конструктора родительского элемента, например:
self.value = property(self.evaluate)
но при доступе к значению объекта он возвращает объект свойства, а не фактическое значение, например: 'A' или 'B.
<property object at 0x7fecd01a88b8>
Я знаю, как обойти эту проблему, но хочу знать, можно ли решить ее с помощью функции / декоратора свойства и без повторения кода.
Возможный дубликат свойства и наследование python





Проблема в том, что выражение 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)
Первое решение - это то, что я ищу.