| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
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__有什么关系呢?。 |   
 
 
 
 |