鱼C论坛

 找回密码
 立即注册
查看: 2148|回复: 4

[已解决]__set__和__setattr__的区别是什么

[复制链接]
发表于 2020-5-22 16:56:06 | 显示全部楼层 |阅读模式

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

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

x
来源于46课后题第0题,感觉有点迷惑。
为什么这里的__get__和__set__方法不需要添加super().__get__,而在使用__setattr__等方法时,为保险起见,最好使用super().__setattr__呢?

这里的代码为自己编写的错误代码,在__get__和__set__方法里均使用了super()继承:
class MyDes:
    def __init__(self,value = None, name = None):
        self.name = name
        self.value = value
    
    def __get__(self,instance,owner):
        print('正在获取变量:%s' % self.name)
        return super().__get__(instance,owner)

    def __set__(self,instance,value):
        print('正在修改变量:%s' % self.name)
        super().__set__(instance,value)

    def __delete__(self,instance):
        print('正在删除变量:%s' % self.name)
        del self.name,self.value
        if self.name:
            print('变量无法删除')
最佳答案
2020-5-22 16:58:14
本帖最后由 Twilight6 于 2020-5-22 17:14 编辑

__set__(self, instance, value) 定义当描述符的值被改变时的行为

__setattr__(self, name, value)  定义当一个实例属性被设置时的行为

一个是描述符值被改变时会被自动调用,另一个是实例属性被设置时自动调用

你可以看看这个:类、实例、局部变量
区清楚这些关系

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-22 16:58:14 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-5-22 17:14 编辑

__set__(self, instance, value) 定义当描述符的值被改变时的行为

__setattr__(self, name, value)  定义当一个实例属性被设置时的行为

一个是描述符值被改变时会被自动调用,另一个是实例属性被设置时自动调用

你可以看看这个:类、实例、局部变量
区清楚这些关系

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

使用道具 举报

发表于 2020-5-22 17:03:03 | 显示全部楼层
__set__ 是给描述符用的,
__setattr__ 是给对象用的。

大概是吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-22 17:43:29 | 显示全部楼层
你先搞明白面向对象,super是表示父类,父类.方法名代表调用父类的某个方法,你这个类都没有继承别的类,自然没有父类,那自然也就不调用super()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 2

使用道具 举报

 楼主| 发表于 2020-5-27 17:05:09 | 显示全部楼层
仔细又复习了一下super函数的用法,就会发现:super函数是对父类同名函数的继承,也就是说,如果父类中不含有某类函数,则不需要用super函数。
pthon中类默认继承自object类,对object类dir一下就会发现:
dir(object)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

其中包含__setattr__等,却不包含定义描述符时所用到的魔法方法。因此,此处不需要super函数来继承。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-21 00:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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