В настоящее время я использую декоратор @property
для получения «получателей и установщиков» в нескольких моих уроках.Я хотел бы иметь возможность наследовать эти @property
методы в дочернем классе.
У меня есть некоторый код 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))
Я отметил часть, которая не работает с комментарием.Я хочу, чтобы возвращение получателя attr базового класса.A.attr
возвращает объект свойства (который, вероятно, очень близок к тому, что мне нужно!).
Редактировать :
После получения ответа от Неда я придумал, что я думаюЭто более элегантное решение этой проблемы.
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
.Это означает, что нам не нужно снова объявлять свойство в дочернем классе.
(Это разница между работой над проблемой в конце дня и работой над ней в начале дня!)