如何使用 属性 装饰器设置基 class 中定义的超级属性?
How to set super attribute defined in base class using property decorator?
我正在尝试从派生 class
的对象为 属性 装饰器设置基础 class 属性
但是当我试图设置它时抛出错误。
这是代码片段
class stats:
_abcd = 5
@property
def abcd(self):
return self._abcd
@abcd.setter
def abcd(self, value):
print('base class')
self._abcd = value
class dele(stats):
@stats.abcd.setter
def abcd(self, value):
print('derived class')
super().abcd = value
a = dele()
a.abcd = 7
print(a.abcd)
这是我得到的错误
derived class
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-23-9271295df674> in <module>
20
21 a = dele()
---> 22 a.abcd = 7
23 print(a.abcd)
<ipython-input-23-9271295df674> in abcd(self, value)
17 def abcd(self, value):
18 print('derived class')
---> 19 super().abcd = value
20
21 a = dele()
AttributeError: 'super' object has no attribute 'abcd'
是的,python 中的 super
行为怪异
解决方法并不完美
@stats.abcd.setter
def abcd(self, value):
print('derived class')
stats.abcd.fset(self, value)
这也不能通过使用 super
访问超类 (super(stats, dele).p.fset(self, value)
)
来解决
我正在尝试从派生 class
的对象为 属性 装饰器设置基础 class 属性
但是当我试图设置它时抛出错误。
这是代码片段
class stats:
_abcd = 5
@property
def abcd(self):
return self._abcd
@abcd.setter
def abcd(self, value):
print('base class')
self._abcd = value
class dele(stats):
@stats.abcd.setter
def abcd(self, value):
print('derived class')
super().abcd = value
a = dele()
a.abcd = 7
print(a.abcd)
这是我得到的错误
derived class
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-23-9271295df674> in <module>
20
21 a = dele()
---> 22 a.abcd = 7
23 print(a.abcd)
<ipython-input-23-9271295df674> in abcd(self, value)
17 def abcd(self, value):
18 print('derived class')
---> 19 super().abcd = value
20
21 a = dele()
AttributeError: 'super' object has no attribute 'abcd'
是的,python 中的 super
行为怪异
解决方法并不完美
@stats.abcd.setter
def abcd(self, value):
print('derived class')
stats.abcd.fset(self, value)
这也不能通过使用 super
访问超类 (super(stats, dele).p.fset(self, value)
)