class Person:
def __init__(self, name):
self.name = name
# Getter function
@property
def name(self):
return self._name
# Setter function
@name.setter
def name(self, value):
if not isinstance(value, str):
raise TypeError('Expected a string')
self._name = value
# Deleter function
@name.deleter
def name(self):
raise AttributeError("Can't delete attribute")
class SubPerson(Person):
@property
def name(self):
print('Getting name')
return super().name
@name.setter
def name(self, value):
print('Setting name to', value)
super(SubPerson, SubPerson).name.__set__(self, value)
@name.deleter
def name(self):
print('Deleting name')
super(SubPerson, SubPerson).name.__delete__(self)
s = SubPerson('Guido')
print(s.name)
当我将 super(SubPerson, SubPerson).name.__set__(self, value)
变成
super(SubPerson, self).name.__set__(self, value)
, 报了这样的错误
AttributeError: 'SubPerson' object has no attribute '_name'
为什么?
1
ipwx 2018-03-09 09:59:57 +08:00
标准里面没有 super(SubPerson, SubPerson) 这种写法吧……即使你手头的 CPython 能工作,也不代表未来的 CPython,或者别的 Python 比如 IronPython 和 PyPy 能工作。建议规避掉这种写法。
|
2
coordinate OP 我已经知道问题所在,结贴了:)
|