|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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()的具体作用是什么?
请大神给予解惑,谢谢!
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 类的相应方法,按照默认行为进行操作。
|
|