super(type, obj) 和 super(type, type) 有什么区别
what is the difference between super(type, obj) and super(type, type)
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')
print(self)
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'
为什么?
super(SubPerson, SubPerson)
是访问 SubPerson
的重写属性的代理,但 super(SubPerson, self)
是访问 self
[= 的重写属性的代理25=]。我的意思是,当它通过 class 字典搜索属性查找时,它会为实例属性而不是 class 属性执行描述符处理。
super(SubPerson, self).name
在 Person.__dict__
中找到 name
属性。然后它 自动调用 __get__
。 getter 尝试读取不存在的 self._name
,因此您的错误。
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')
print(self)
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'
为什么?
super(SubPerson, SubPerson)
是访问 SubPerson
的重写属性的代理,但 super(SubPerson, self)
是访问 self
[= 的重写属性的代理25=]。我的意思是,当它通过 class 字典搜索属性查找时,它会为实例属性而不是 class 属性执行描述符处理。
super(SubPerson, self).name
在 Person.__dict__
中找到 name
属性。然后它 自动调用 __get__
。 getter 尝试读取不存在的 self._name
,因此您的错误。