课时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__有什么关系呢?。 super != super()
你在类里面打印一下 dir(super())看看就知道了 qiuyouzhi 发表于 2021-8-23 17:38
super != super()
你在类里面打印一下 dir(super())看看就知道了
没明白的是C类默认继承的不都是Object类吗?和super()有没有__getattr__有什么关系呢?。 非凡 发表于 2021-8-23 18:38
没明白的是C类默认继承的不都是Object类吗?和super()有没有__getattr__有什么关系呢?。
?
也没说它俩有啥关系呀
页:
[1]