В настоящее время я использую декоратор @property
для достижения «геттеров и сеттеров» в нескольких моих классах. Я хочу унаследовать эти методы @property
в дочернем классе.Переопределение унаследованных объектов свойств в Python
У меня есть некоторый код Python (в частности, я работаю в py3k), который выглядит неопределенно, как так:
class A:
@property
def attr(self):
try:
return self._attr
except AttributeError:
return ''
class B(A):
@property
def attr(self):
return A.attr # The bit that doesn't work.
@attr.setter
def attr(self, value):
self._attr = value
if __name__ == '__main__':
b = B()
print('Before set:', repr(b.attr))
b.attr = 'abc'
print(' After set:', repr(b.attr))
Я отмеченную часть, которая не работает с комментарием. Я хочу, чтобы getter getter базового класса возвращался. A.attr
возвращает объект недвижимости (который, вероятно, очень близок к тому, что мне нужно!).
Edit:
После получения ответа от Ned ниже я придумал, что я думаю, что это более элегантное решение этой проблемы.
class A:
@property
def attr(self):
try:
return self._attr
except AttributeError:
return ''
class B(A):
@A.attr.setter
def attr(self, value):
self._attr = value
if __name__ == '__main__':
b = B()
print('Before set:', repr(b.attr))
b.attr = 'abc'
print(' After set:', repr(b.attr))
.setter
декоратор ожидает объект свойства, которые мы можем получить с помощью @A.attr
. Это означает, что нам не нужно снова объявлять свойство в дочернем классе.
(! Это разница между работой над проблемой в конце дня против работать над ней в начале дня)
У меня была такая же проблема, и может подтвердить ваш ответ работает, но WOW то, что $ hitty «особенность» - Добавление суперкласс связи! !! Это плохой дизайн на стороне python. Либо это, либо «переопределить» свойство. Либо дрянные «решения» для наследования. – Marc