鱼C论坛

 找回密码
 立即注册
查看: 1172|回复: 21

[已解决]45讲第3题

[复制链接]
发表于 2020-6-1 16:59:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
>>> 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

像这样 return super().__getattribute__(name) 的语句,调动基类的方法是干啥用的?
最佳答案
2020-6-1 17:35:59
jump_p 发表于 2020-6-1 17:28
我试了一下,如果不写return super().__getattribute__(name),就只会返回2(按道理找不到x也会执行__get ...

那么__getattr__是__getattribute__的父类

他们都属于方法,没有父子类之分,当你 没有特别指明的 类都默认 继承 object 类,也就是基类,基类中有 __getattr__和__getattribute__ 方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-1 17:02:25 | 显示全部楼层
学的真快   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-1 17:04:59 | 显示全部楼层

所以知道问题的答案吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-1 17:05:02 | 显示全部楼层
super().__getattribute__(name)   基类可以说就是父类
继承 父类的 __getattribute__ 方法,这边返回等于直接使用父类方法进行返回
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-1 17:10:13 | 显示全部楼层
jump_p 发表于 2020-6-1 17:04
所以知道问题的答案吗

为什么我在另一个帖子一直被审核,这个帖子不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-1 17:11:03 | 显示全部楼层
Twilight6 发表于 2020-6-1 17:10
为什么我在另一个帖子一直被审核,这个帖子不会

你我有缘
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-1 17:12:43 | 显示全部楼层

可以可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-1 17:14:19 | 显示全部楼层
Twilight6 发表于 2020-6-1 17:05
super().__getattribute__(name)   基类可以说就是父类
继承 父类的 __getattribute__ 方法,这边返回等于 ...

我又重新理解了一下,有点懂了。如果这里不写return super().__getattribute__(name),则会返回None。但是写了这句,会返回啥?比如c = C(),c.x,先调用__getattribute__(),返回2,然后执行return super().__getattribute__(name),找不到x,为啥就会执行 __getattr__返回1呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-1 17:21:14 | 显示全部楼层
jump_p 发表于 2020-6-1 17:14
我又重新理解了一下,有点懂了。如果这里不写return super().__getattribute__(name),则会返回None。但 ...

但是写了这句,会返回啥?

__getattribute__ 作用是访问属性时候会自动调用,用于获取其属性
__getattr__ 就是当属性找不到时候调用 返回一个值,或者报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-1 17:22:29 | 显示全部楼层
jump_p 发表于 2020-6-1 17:14
我又重新理解了一下,有点懂了。如果这里不写return super().__getattribute__(name),则会返回None。但 ...

就是因为找不到 x 所以会执行 __getattr__
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-1 17:28:48 | 显示全部楼层
Twilight6 发表于 2020-6-1 17:22
就是因为找不到 x 所以会执行 __getattr__

我试了一下,如果不写return super().__getattribute__(name),就只会返回2(按道理找不到x也会执行__getattr__呀,但是没有执行),只有加了return super().__getattribute__(name)才执行了__getattr__。如果这句的意思是按照父类的方法返回,那么__getattr__是__getattribute__的父类?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-1 17:32:36 | 显示全部楼层
本帖最后由 Twilight6 于 2020-6-1 17:34 编辑
jump_p 发表于 2020-6-1 17:28
我试了一下,如果不写return super().__getattribute__(name),就只会返回2(按道理找不到x也会执行__get ...


我也记混了,太久没温习魔法方法了

__getattribute__ 通过实例访问属性,被调用。
如果class中定义了__getattr__(),则__getattr__()不会被调用  除非显示调用或引发AttributeError异常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-1 17:35:59 | 显示全部楼层    本楼为最佳答案   
jump_p 发表于 2020-6-1 17:28
我试了一下,如果不写return super().__getattribute__(name),就只会返回2(按道理找不到x也会执行__get ...

那么__getattr__是__getattribute__的父类

他们都属于方法,没有父子类之分,当你 没有特别指明的 类都默认 继承 object 类,也就是基类,基类中有 __getattr__和__getattribute__ 方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-1 17:49:17 | 显示全部楼层
Twilight6 发表于 2020-6-1 17:35
他们都属于方法,没有父子类之分,当你 没有特别指明的 类都默认 继承 object 类,也就是基类,基类 ...

魔法方法真的太折磨人了,似懂非懂,先这么着吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-1 17:51:23 | 显示全部楼层
jump_p 发表于 2020-6-1 17:49
魔法方法真的太折磨人了,似懂非懂,先这么着吧

等等我晚上如果有时间的话就回去重新温习下  看下能不能解释清楚给你听
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-1 17:53:31 | 显示全部楼层
Twilight6 发表于 2020-6-1 17:51
等等我晚上如果有时间的话就回去重新温习下  看下能不能解释清楚给你听

太感谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-1 17:54:09 | 显示全部楼层

没事,就是要负责点 不然对不起你的最佳
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-1 18:48:05 | 显示全部楼层
Twilight6 发表于 2020-6-1 17:54
没事,就是要负责点 不然对不起你的最佳

我隐约觉得是对_getattribute__进行了重写,所以要还原一下的意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-1 18:49:31 | 显示全部楼层
jump_p 发表于 2020-6-1 18:48
我隐约觉得是对_getattribute__进行了重写,所以要还原一下的意思。

你觉得是没错的  super 就是重新继承 __getattribute__ 原有的方法,只是你在原来的 __getattribute__ 加了print 变成了新的  __getattribute__ 方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-1 19:03:38 | 显示全部楼层
Twilight6 发表于 2020-6-1 18:49
你觉得是没错的  super 就是重新继承 __getattribute__ 原有的方法,只是你在原来的 __getattribute__ 加 ...

嗯嗯, 就是说__getattribute__能够在属性不存在的情况下自动调用__getattr__,所以加了 return super().__getattribute__(name)重新继承后才能返回1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 22:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表