美文网首页python从入门到放弃
__getattr__和__getattribute__ 区别

__getattr__和__getattribute__ 区别

作者: 楠木cral | 来源:发表于2020-08-05 15:13 被阅读0次

    对于这两个魔法方法的区别,只需要知道,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方法,一般情况下不会重写这个方法容易出错

    相关文章

      网友评论

        本文标题:__getattr__和__getattribute__ 区别

        本文链接:https://www.haomeiwen.com/subject/ehtorktx.html