鱼C论坛

 找回密码
 立即注册
查看: 2101|回复: 2

[已解决]super().魔法方法的问题

[复制链接]
发表于 2023-4-9 11:45:06 | 显示全部楼层 |阅读模式

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

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

x
class D:
    def __init__(self):
        self._x = 250
    def __getattr__(self,name):
        if name == 'x':
            return self._x
        else:
            super().__getattr__(name)
    def __setattr__(self,name,value):
        if name == 'x':
            super().__setattr__('_x',value)
        else:
            super().__setattr__(name,value)
    def __delattr__(self,name):
        if name == 'x':
            super().__delattr__('_x')
        else:
            super().__delattr__(name)

super()会去父类里寻找方法,上面的代码里魔法方法的父类是去哪找?这个代码里super()的具体作用是什么?
请大神给予解惑,谢谢!
最佳答案
2023-4-9 11:46:43
super() 函数用于调用父类(或者兄弟类)的方法。在 Python 中,所有的类都隐式继承自 object 类,这是 Python 类的基类。在你提供的代码中,super() 会去查找 object 类中相应的魔法方法。具体来说:

  • super().__getattr__(name):当查找属性时,如果 D 类中没有找到该属性,就会调用 object 类的 __getattr__ 方法。然而,实际上 object 类并没有实现 __getattr__ 方法,所以这会抛出一个 AttributeError。
  • super().__setattr__(name, value):在设置属性值时,会调用 object 类的 __setattr__ 方法,这会将属性值设置为给定值。
  • super().__delattr__(name):在删除属性时,会调用 object 类的 __delattr__ 方法,这会删除指定的属性。


在这个例子中,D 类的实例有一个名为 _x 的属性。然而,类中定义了 __getattr__, __setattr__ 和 __delattr__ 魔法方法,它们会拦截任何对 x 属性的操作,并将其映射到 _x 属性上。这样,当你试图访问、设置或删除 x 属性时,实际上你在操作的是 _x 属性。而对于其他属性,super() 会调用 object 类的相应方法,按照默认行为进行操作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-9 11:46:43 | 显示全部楼层    本楼为最佳答案   
super() 函数用于调用父类(或者兄弟类)的方法。在 Python 中,所有的类都隐式继承自 object 类,这是 Python 类的基类。在你提供的代码中,super() 会去查找 object 类中相应的魔法方法。具体来说:

  • super().__getattr__(name):当查找属性时,如果 D 类中没有找到该属性,就会调用 object 类的 __getattr__ 方法。然而,实际上 object 类并没有实现 __getattr__ 方法,所以这会抛出一个 AttributeError。
  • super().__setattr__(name, value):在设置属性值时,会调用 object 类的 __setattr__ 方法,这会将属性值设置为给定值。
  • super().__delattr__(name):在删除属性时,会调用 object 类的 __delattr__ 方法,这会删除指定的属性。


在这个例子中,D 类的实例有一个名为 _x 的属性。然而,类中定义了 __getattr__, __setattr__ 和 __delattr__ 魔法方法,它们会拦截任何对 x 属性的操作,并将其映射到 _x 属性上。这样,当你试图访问、设置或删除 x 属性时,实际上你在操作的是 _x 属性。而对于其他属性,super() 会调用 object 类的相应方法,按照默认行为进行操作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-9 11:50:56 | 显示全部楼层
感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-29 09:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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