python从入门到放弃

__getattr__和__getattribute__ 区别

2020-08-05  本文已影响0人  楠木cral

对于这两个魔法方法的区别,只需要知道,getattr方法是在查找不到这个类的属性抛异常了才会调用,而getattribute则是无论访问什么属性都会调用.从而我们就需要根据自己的需求来重写它们的逻辑.
举个例:

class Student:
    def __init__(self, name,age):
        self.name = name
        self.age = age
    def __getattr__(self, item):
        returnn 'not find the attr'
if __name__ == '__main__':
    st = Student('小明', 10)
    print(st.Name)   # 打印出  'not find the attr'

根据打印知道如果访问这个对象没有的属性就会调用getattr这个方法,从而可以重写这个方方法实现一些我们想要的逻辑,比如:

class Student:
    def __init__(self, name,age, info):
        self.name = name
        self.age = age
        self.info = info
    def __getattr__(self, item):
        return self.info[item]
if __name__ == '__main__':
    st = Student('小明', 10, info={'number': '5120152566', 'broth': '2016-9-6'})
    print(st.number)   # 打印出 '5120152566'

在查找这个对象的number属性时,发现没有,就会调用重写后的getattr方法去对象的info属性里面再查找这个属性并返回.

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

    # def __getattr__(self, item):
    #     return self.info[item]

    def __getattribute__(self, item):
        return '属性呀'

if __name__ == '__main__':
    st = Student('小明', 10, info={'number': '5120152566', 'broth': '2016-9-6'})
    print(st.name)  # 打印出 '属性呀'
    print(st.number)   #打印出 '属性呀'

无论访问什么属性都会调用getattribute方法,一般情况下不会重写这个方法容易出错

上一篇下一篇

猜你喜欢

热点阅读