python-attr和item系列属性

一、概述

  __getattr__、__setattr__、__delattr__和__getitem__、__setitem__、__delitem__都是对属性的操作.触发条件相同,方式不同。

  

二、attr系列方法

 

class Foo:
    x = 1

    def __init__(self, y):
        self.y = y

    def __getattr__(self, item):
        print("执行了__getatrr__")

    def __setattr__(self, key, value):
        print("执行__setattr__")
        # self.key = value    # 会死递归。循环触发__setatt__
        self.__dict__[key] = value

    def __delattr__(self, item):
        print("执行__delattr__")
        self.__dict__.pop(item)


f = Foo(10)
f.g  # 当没有找到属性时,就触发执行__getattr__

f.z = 2  # 当新增、修改属性时,触发执行__setattr__
print("新增z属性后:", f.__dict__)

del f.z
print("删除z属性后:", f.__dict__)  # 当删除属性时,触发执行__delattr__

  运行结果

执行__setattr__
执行了__getatrr__
执行__setattr__
新增z属性后: {'y': 10, 'z': 2}
执行__delattr__
删除z属性后: {'y': 10}

 

三、item系列方法

class Foo:
    def __init__(self,name):
        self.name = name

    def __getitem__(self, item):
        print("执行__getitem__")
        return self.__dict__[item]

    def __setitem__(self, key, value):
        print("执行__setitem__")
        self.__dict__[key] = value

    def __delitem__(self, key):
        print("执行__delitem__")
        self.__dict__.pop(key)


# 实例化Foo
f = Foo("狗不理")
print(f.__dict__)
f["name"]   # 通过字典[]方式获取属性,触发__getitem__

f["age"] = 100  #通过字典[]方式新增、修改属性,触发__setitem__
print(f.__dict__)

del f["age"]
print(f.__dict__) # 通过字典[]方式删除属性,触发__delitem__

  运行结果

 

 

{'name': '狗不理'}
执行__getitem__
执行__setitem__
{'name': '狗不理', 'age': 100}
执行__delitem__
{'name': '狗不理'}

 

 

 

 

 

 

 

 

posted on 2019-11-19 22:19  别动我的锅  阅读(345)  评论(0)    收藏  举报

导航

levels of contents