Как переопределить установщики и получатели функции свойства в python? - PullRequest
0 голосов
/ 24 сентября 2018

Я создаю члены, используя функцию свойства, но когда я пытаюсь переопределить установщики и получатели этих свойств, он всегда ссылается на установщики и получатели родительского класса:

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'

Я попытался поместить определение элемента value внутри конструктора родителя, например:

self.value = property(self.evaluate)

, но при доступе к значению объекта возвращается объект свойства, а не фактическое значение, например: 'Aили Б.

<property object at 0x7fecd01a88b8>

Я знаю, как обойти эту проблему, но я хочу знать, возможно ли ее решить с помощью функции / декоратора свойства и без повторения кода.

1 Ответ

0 голосов
/ 24 сентября 2018

Проблема в том, что выражение 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...