Python - __setattr__和__getattr__

class Foo(object):

    def __init__(self):
        # 1. 用父类object的__setattr__写没有问题,因为是调用object里的__setattr__,所以Foo里的__setattr__不会执行,也就没有递归了
        # 2. 这样以后,Foo()对象也有storage变量了,是一个{}。
        object.__setattr__(self, 'storage', {})
        # 3. 如果这样写会无限递归,看到对象.xx就会调用__setattr__,而这里的__setattr__里面也有对象.xx,就一直调用__setattr__
        # self.storage = {}    

    def __setattr__(self, key, value):
        self.storage = {'k1':'v1'}
        print(key,value)
        #self.__dict__[key] = value

    def __getattr__(self, item):
        print(item)
        return 'df'
        
    def __delattr__(self, item):
        # self.__dict__.pop(item)

obj = Foo()

# obj.x = 123             由__setattr__ magic function实现
# 对象.xx                   由__getattr__ magic function实现


posted @ 2018-05-10 14:55  Rocin  阅读(228)  评论(0编辑  收藏  举报