Python笔记: __getattribute__、__getattr__、__getitem__的区别

#!/usr/bin/env python
#-*- coding:utf-8 -*-
"""对比__getattribute__、__getattr__、__getitem__函数的区别"""

class AboutAttr(dict):
    def __init__(self, name):
        self.name = name
        self.dict = {}

    def __getattribute__(self, item):
        print("in __getattribute__ key:%s"%item)
        try:
            return super(AboutAttr, self).__getattribute__(item)
        except KeyError:
            #这里不会触发
            print("KeyError:%s"%item)
            raise
        except AttributeError:
            #当属性不存在时
            print("AttributeError:%s"%item)
            raise

    def test(self):
        print("test")

    def __getattr__(self, item):
        #当没有改属性时(即__getattribute__报错时),调用当前函数
        print("in __getattr__ key:%s"%item)
        #return self.dict[item] #通过hasattr判断不存在的键能正常返回false,也就是报错的时候才返回False
        return self.dict.get(item, None) #通过hasattr判断的不存在的也会返回true,

    def __getitem__(self, item):
        print("in __getitem__ key:%s"%item)
        return super(AboutAttr, self).__getitem__(item)

    def __setitem__(self, key, value):
        #如果基类不是dict之类的对象,则调用super里面的__setitem__会报错
        print("in __setitem__ key:%s, value:%s"%(key, value))
        return super(AboutAttr, self).__setitem__(key, value)

if __name__=="__main__":
    a = AboutAttr("a")
    print a.get("name") #对应的调用__getitem__
    print a.name
    #print a.not_exists
    a["t"] = "t"
    print a["t"]
    print a.test
    print a.test()
    print getattr(a, "test")
    print getattr(a, "name")
    print hasattr(a, "nnn")

"""打印结果
in __getattribute__ key:get
None
in __getattribute__ key:name
a
in __setitem__ key:t, value:t
in __getitem__ key:t
t
in __getattribute__ key:test
<bound method AboutAttr.test of {'t': 't'}>
in __getattribute__ key:test
test
None
in __getattribute__ key:test
<bound method AboutAttr.test of {'t': 't'}>
in __getattribute__ key:name
a
in __getattribute__ key:nnn
AttributeError:nnn
in __getattr__ key:nnn
in __getattribute__ key:dict
True 
"""


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值