非凡 发表于 2021-8-23 17:22:24

课时45,课后练习第三题

3\在不上机验证的情况下,你能推断以下代码分别会显示什么吗?
class C:
      def __getattr__(self, name):
                print(1)
                return super().__getattr__(name)
      def __getattribute__(self, name):
                print(2)
                return super().__getattribute__(name)
      def __setattr__(self, name, value):
                print(3)
                super().__setattr__(name, value)
      def __delattr__(self, name):
                print(4)
                super().__delattr__(name)

>>> c = C()
>>> c.x
2
1
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
    c.x
File "<pyshell#29>", line 4, in __getattr__
    return super().__getattr__(name)
AttributeError: 'super' object has no attribute '__getattr__'
答案中是这么解释:
为什么会如此显示呢?我们来分析下:首先 c.x 会先调用 __getattribute__() 魔法方法,打印 2;然后调用 super().__getattribute__(),找不到属性名 x,因此会紧接着调用 __getattr__() ,于是打印 1;但是你猜到了开头没猜到结局……当你希望最后以 super().__getattr__() 终了的时候,Python 竟然告诉你 AttributeError,super 对象木有 __getattr__ !!
求证:
>>> dir(super)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__self_class__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__thisclass__']


问题来了~没明白的是C类默认继承的不都是Object类吗?和super有没有__getattr__有什么关系呢?。

qiuyouzhi 发表于 2021-8-23 17:38:54

super != super()
你在类里面打印一下 dir(super())看看就知道了

非凡 发表于 2021-8-23 18:38:25

qiuyouzhi 发表于 2021-8-23 17:38
super != super()
你在类里面打印一下 dir(super())看看就知道了

没明白的是C类默认继承的不都是Object类吗?和super()有没有__getattr__有什么关系呢?。

qiuyouzhi 发表于 2021-8-23 18:41:50

非凡 发表于 2021-8-23 18:38
没明白的是C类默认继承的不都是Object类吗?和super()有没有__getattr__有什么关系呢?。


也没说它俩有啥关系呀
页: [1]
查看完整版本: 课时45,课后练习第三题