首页 > 其他学习 > python > python中属性操作的魔法方法
2018
11-23

python中属性操作的魔法方法

__getattribute__():属性访问拦截器

在访问对象的属性时自动调用。在python中,类的属性和方法都理解为属性,均可以通过__getattribute__访问或拦截。

class Test:
    def __init__(self,x,y):
        self.x=x
        self.y=y
    def __getattribute__(self,name):
        if name == 'x':
            return '想要获取x值?没门'
        else:
            return super().__getattribute__(name)
a=Test(2,5)
print(a.x)
想要获取x值?没门
print(a.y)
5

Test类对父类object类中的__getattribute__()方法进行了重写,参数name对应的是要访问的属性,要访问x属性,对该属性重写,返回与x值不同的字符串,访问y属性时,调用其父类中的__getattribute__()方法,返回正常的y属性的值。

PS:最后else语句使用的是调用父类的__getattribute__()方法返回正常值,而不是直接返回self.name,因为这样会导致无限递归,从而程序崩溃

__getattr__(self, name):访问的name属性不存在的时候自动调用该方法

__setattr__(self, name, value):给属性赋值

def __setattr__(self, name, value):
    self.name = value
    # 每次执行语句self.name = value语句都自动调用self.__setattr__(name, value),导致一直调用自己(无限递归),直到程序崩溃
def __setattr__(self, name, value):
    self.__dict__[name] = value 
    # 使用__dict__进行赋值是以正确的做法

__delattr_(self, name):删除属性,和__setattr__()方法一样,不要使用del self.name语句操作,会无限递归导致程序崩溃,使用del self.__dict__[name]语句操作

最后编辑:
作者:qingheluo
这个作者貌似有点懒,什么都没有留下。