Python中的__getattr__和__getattriute__的区别

  • Post author:
  • Post category:python



一般情况下我们都是通过下面的方法访问对象的属性

class Student(object):
    def __init__(self,name):
        self.name = name

s = Student("jack")
print(s.name) # 通过s.name 访问对象s的name属性
print(s.age) # 属性age不存在,抛出异常AttributeError: 'Student' object has no attribute 'age'


在一个类中重写了__getattr__方法

class Student(object):
    def __init__(self,name):
        self.name = name

    def __getattr__(self, item):
        print("__getattr__")


s = Student("jack")
print(s.name)
print(s.age)
jack # s存在name属性,正常访问
__getattr__ # 因为s没有age属性,执行__getattr__方法
None # 这里的None是因为__getattr__没有返回值,故返回None

当我们重写了__getattr__方法后,如果我们访问的属性存在,则正常访问,如果访问的属性不存在,则执行__getattr__方法


在一个类中重写了__getattribute__方法

class Student(object):
    def __init__(self,name):
        self.name = name

    def __getattr__(self, item):
        print("__getattr__")

    def __getattribute__(self, item):
        print("__getattribute__")


s = Student("jack")
print(s.name)
print(s.age)
__getattribute__
None
__getattribute__
None

如果一个类中重写了__getattribute__方法,则当我们访问该类的属性的时候,无论该属性是否存在,都会直接调用__getattribute__方法,并且不会在调用__getattr__方法。所以我们在重写__getattribute__方法切记不能在该方法中访问对象的属性,这样会导致无限递归,直到Python限制的最大递归层数。



版权声明:本文为weixin_43989215原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。