spflmm 发表于 2023-4-9 11:45:06

super().魔法方法的问题

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()的具体作用是什么?
请大神给予解惑,谢谢!

isdkz 发表于 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 类的相应方法,按照默认行为进行操作。

spflmm 发表于 2023-4-9 11:50:56

感谢!
页: [1]
查看完整版本: super().魔法方法的问题