鱼C论坛

 找回密码
 立即注册
查看: 3059|回复: 6

45讲里的一个程序,求助

[复制链接]
发表于 2016-3-12 20:24:36 | 显示全部楼层 |阅读模式

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

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

x
class C:
    def __getattr__(self,name):
        print('getattr')
    def __getattribute__(self,name):
        print('getattribute')
        super().getattribute(name)
    def __setattr__(self,name,value):
        print('setattr')
    def __delattr__(self,name):
        print('delattr')
        super().__delattr__(name)
为什么 这里要加一个super()呢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-3-12 23:04:09 | 显示全部楼层
本帖最后由 shuofxz 于 2016-3-13 00:30 编辑

python的类有继承你知道吧,所有的类的最终父类是Object
即使你不写,python也会默认帮你加上,所以你这个类C其实是继承Object的
在Object类里面定义了一些函数,子类中同名函数会覆盖父类中的函数
若是覆盖的函数要保留其函数中的方法,再添加新的方法用‘父类名.函数名(self)’将其添加进来
或者调用super()函数,‘super().父类的函数()’
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-13 19:17:22 | 显示全部楼层
shuofxz 发表于 2016-3-12 23:04
python的类有继承你知道吧,所有的类的最终父类是Object
即使你不写,python也会默认帮你加上,所以你这个 ...

嗯嗯,好的,明白了谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-13 19:53:30 | 显示全部楼层
shuofxz 发表于 2016-3-12 23:04
python的类有继承你知道吧,所有的类的最终父类是Object
即使你不写,python也会默认帮你加上,所以你这个 ...

还想问一下为什么这里要额外的加上super方法呢,好像不加也不会出现死循环,__setattr__这里就没加呢?我刚刚看到这里,谢谢了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-13 20:11:52 | 显示全部楼层
笔端流年 发表于 2016-3-13 19:53
还想问一下为什么这里要额外的加上super方法呢,好像不加也不会出现死循环,__setattr__这里就没加呢?我 ...

这个调用只不过是重写(替换)了父类里面的方法,
还拿__delattr__这个方法举例,你执行del xxx就是删除某个属性,现在你把这个方法改成了
  1. def __delattr__(self,name):
  2.         print('delattr')
  3.         super().__delattr__(name)
复制代码

那么在删除方法的时候除了删除,还会打印'delattr',
当然这个方法怎么写全靠你定义,如果你写的时候写成了这样
  1. def __delattr__(self,name):
  2.         print('delattr')
复制代码

那么在调用del xxx   的时候就只会打印'delattr',但不具备真正的删除属性的功能了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-13 20:11:58 | 显示全部楼层
笔端流年 发表于 2016-3-13 19:53
还想问一下为什么这里要额外的加上super方法呢,好像不加也不会出现死循环,__setattr__这里就没加呢?我 ...

这个调用只不过是重写(替换)了父类里面的方法,
还拿__delattr__这个方法举例,你执行del xxx就是删除某个属性,现在你把这个方法改成了
  1. def __delattr__(self,name):
  2.         print('delattr')
  3.         super().__delattr__(name)
复制代码

那么在删除方法的时候除了删除,还会打印'delattr',
当然这个方法怎么写全靠你定义,如果你写的时候写成了这样
  1. def __delattr__(self,name):
  2.         print('delattr')
复制代码

那么在调用del xxx   的时候就只会打印'delattr',但不具备真正的删除属性的功能了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-13 20:17:59 | 显示全部楼层
shuofxz 发表于 2016-3-13 20:11
这个调用只不过是重写(替换)了父类里面的方法,
还拿__delattr__这个方法举例,你执行del xxx就是删除 ...

多谢版主,多谢版主
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-20 04:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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