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).namePerson.__dict__ 中找到 name 属性。然后它 自动调用 __get__。 getter 尝试读取不存在的 self._name,因此您的错误。