super(type, obj) 和 super(type, type)的区别在哪?

2018-03-09 09:43:31 +08:00
 coordinate
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'

为什么?

2179 次点击
所在节点    Python
2 条回复
ipwx
2018-03-09 09:59:57 +08:00
标准里面没有 super(SubPerson, SubPerson) 这种写法吧……即使你手头的 CPython 能工作,也不代表未来的 CPython,或者别的 Python 比如 IronPython 和 PyPy 能工作。建议规避掉这种写法。
coordinate
2018-03-09 15:42:41 +08:00
我已经知道问题所在,结贴了:)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/436384

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX