鱼C论坛

 找回密码
 立即注册
查看: 1180|回复: 5

[已解决]上课代码看不懂求解答

[复制链接]
发表于 2020-6-23 20:24:07 | 显示全部楼层 |阅读模式

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

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

x
[code
]class C:
    def __getattribute__(self,name):
        print('getattribute')
        return supper().__getattribute__(name)
    def __getattr__(self,name):
        print('getattr')
    def __setattr__(self,name,value):
        print('setattr')
        super().__setattr__(name,value)
    def __delattr__(self,name):
        print('delattr')
        supper().__delattr__(name)
[/code]
在这个代码中有几个疑问看不懂。
1.在上述的四个方法当中为什么只有第一个方法有返回语句而其他的都没有返回?在第三和第四的方法中都和第一个方法一样最后调用了基类的方法为什么他们前面不加上return?
2.第一个方法中最后的返回语句(return supper().__getattribute__(name))的必然性或者说他的作用是什么?不加可以吗?没有看出来最后加上的这个返回是返回给谁的并且返回的是什么?
3.举一个初始化的例子:c.x=1  运行的出来的结果是setattr
                          之后  c.x       运行出来的结果是getattribute
                                                                        1
可以结合上述初始化例子解答一下我上述的疑惑
最佳答案
2020-6-23 20:44:33
1.在上述的四个方法当中为什么只有第一个方法有返回语句而其他的都没有返回?在第三和第四的方法中都和第一个方法一样最后调用了基类的方法为什么他们前面不加上return?


这就要你先了解了解这些魔法方法的具体作用了,因为当你获取一个属性的时候,当然要有个能将值返回出来的方法,也就是 __getattribute__

但是 __setattr__、__delattr__的主要作用是什么呢? 一个是用来设置属性的,一个是用来删除属性的,这些功能没有必要有返回值~ 所以无需设置返回值

2.第一个方法中最后的返回语句(return supper().__getattribute__(name))的必然性或者说他的作用是什么?不加可以吗?没有看出来最后加上的这个返回是返回给谁的并且返回的是什么?


不加不行哈,必须要调用父类的方法,因为我们这里重写了 __getattribute__ 导致 失去了原来的功能

而 __getattribute__ 功能是当你访问类中属性时候,就会自动触发,并返回该属性

当访问一个不存在类中的属性时候,__getattribute__会自动引发一个异常,而这个异常会被 __getattr__ 所捕获,如果你没有调用父类的方法,那么 __getattribute__也就不会有这些功能了

而我们重写的目的就是为了知道这些方法先后顺序,当然要保留功能的完整性

3.举一个初始化的例子:c.x=1  运行的出来的结果是setattr
                          之后  c.x       运行出来的结果是getattribute
                                                                        1

c.x 是为这个类设置属性嘛,所以 __setattr__ 会捕获你这个赋值时候的命令,来自动执行 __setattr__ 方法所以打印了 setattr

而 c.x 是访问你之前设置好了的属性 也就是说 这个属性是确实存在的 那么只要访问属性都会调用 __getattribute__

所以打印了 getattribute  ,后面的 1 是返回你 x 属性的值;而如果属性不存在还会自动调用 __getattr__ 方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-23 20:24:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

发表于 2020-6-23 20:31:23 | 显示全部楼层



哈 你代码里面的 super 都多打了一个p 了

骚等 我看看问题哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-6-23 20:44:33 | 显示全部楼层    本楼为最佳答案   
1.在上述的四个方法当中为什么只有第一个方法有返回语句而其他的都没有返回?在第三和第四的方法中都和第一个方法一样最后调用了基类的方法为什么他们前面不加上return?


这就要你先了解了解这些魔法方法的具体作用了,因为当你获取一个属性的时候,当然要有个能将值返回出来的方法,也就是 __getattribute__

但是 __setattr__、__delattr__的主要作用是什么呢? 一个是用来设置属性的,一个是用来删除属性的,这些功能没有必要有返回值~ 所以无需设置返回值

2.第一个方法中最后的返回语句(return supper().__getattribute__(name))的必然性或者说他的作用是什么?不加可以吗?没有看出来最后加上的这个返回是返回给谁的并且返回的是什么?


不加不行哈,必须要调用父类的方法,因为我们这里重写了 __getattribute__ 导致 失去了原来的功能

而 __getattribute__ 功能是当你访问类中属性时候,就会自动触发,并返回该属性

当访问一个不存在类中的属性时候,__getattribute__会自动引发一个异常,而这个异常会被 __getattr__ 所捕获,如果你没有调用父类的方法,那么 __getattribute__也就不会有这些功能了

而我们重写的目的就是为了知道这些方法先后顺序,当然要保留功能的完整性

3.举一个初始化的例子:c.x=1  运行的出来的结果是setattr
                          之后  c.x       运行出来的结果是getattribute
                                                                        1

c.x 是为这个类设置属性嘛,所以 __setattr__ 会捕获你这个赋值时候的命令,来自动执行 __setattr__ 方法所以打印了 setattr

而 c.x 是访问你之前设置好了的属性 也就是说 这个属性是确实存在的 那么只要访问属性都会调用 __getattribute__

所以打印了 getattribute  ,后面的 1 是返回你 x 属性的值;而如果属性不存在还会自动调用 __getattr__ 方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-6-23 20:46:14 | 显示全部楼层
Twilight6 发表于 2020-6-23 20:44
这就要你先了解了解这些魔法方法的具体作用了,因为当你获取一个属性的时候,当然要有个能将值返回出来 ...

马上就可以取领小甲鱼的全套书籍了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-6-24 08:54:10 | 显示全部楼层
Twilight6 发表于 2020-6-23 20:44
这就要你先了解了解这些魔法方法的具体作用了,因为当你获取一个属性的时候,当然要有个能将值返回出来 ...

谢谢,很详细
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 07:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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