python面向对象内置方法关于属性篇

1、关于__xxxattr__之__getattr__、__setattr__、__delattr__

2、关于__xxxitem__之__getitem__、__setitem__、__delitem__

起步之attr,(attribute属性),我们可以通过对象来调用属性,如果调用的属性存在,那么我们将会得到这个属性,如果这个属性不存在但是不会报错(前提是我们写了__getattr__方法),将会调用__getattr__方法,与之类似的还有__getattribute__方法,

当我们在类中同时写了__getattr__和__getattribute__方法时,调用属性时将只会执行后者,无论这个属性是否存在都会执行,而__getattr__仅当属性不存在时才会被调用

慢走之__setattr__,这个方法比较神奇,只要属性被赋值便会执行这个方法,当对象实例化时如果其中有属性被赋值便会执行该方法,当为对象添加新属性时也会执行这个方法。通过这个特性,我们可以对添加的属性进行定制,比如只能添加int类型或者str类型的。。。然而这里面有坑。当通过self.key = value方式添加新属性时,将会产生循环调用,导致报错,所以这时我们可以通过操作属性字典的方式进行添加新属性。

完成之__delattr__,前面提到过属性的增删改查,当我们定义过__delattr__方法后,删除属性时将会调用该方法,此处有坑,不能在_delattr__方法内通过del self.item直接删除属性,否则还是会出现循环调用导致报错,多以还是通过操作字典的方式进行操作。


class Foo2(object):
    def __init__(self):
        self.name = 'ajune'

    # 通过对象.属性的方式访问属性时才会调用
    def __getattr__(self, item):
        # 获取的属性不存在时将会调用该方法
        print('__getattr__被调用')

    # 当__getattribute__与__getattr__同时存在,只会执行__getattrbute__,
    # 除非__getattribute__在执行过程中抛出异常AttributeError
    # def __getattribute__(self, item):
    #     # 无论属性是否存在都会调用该方法
    #     print('__getattribute__方法被调用')

    def __setattr__(self, key, value):
        print('__setattr__方法被调用')
        # self.__dict__[key] = value
        # self.key = value  # 产生循环调用,无法设置
        # 通过函数的实现,实现对设置的属性进行限定
        if type(value) is str:
            print('开始设置')
            # self.k=v #触发__setattr__
            self.__dict__[key] = value.upper()
        else:
            print('必须是字符串类型')

    def __delattr__(self, item):
        print('__delattr__方法被调用')
        # del self.item         # 循环调用,报错
        self.__dict__.pop(item)

啊啊啊啊啊啊啊啊。开始了__xxxitem__,这些东西就一句话,只用通过字典调用的方式才会执行下列的方法,没错你没听错,字典,这时可以类当做字典了,有没有感到很神奇?


class Fo1(object):
    # 通过字典的方式使用属性才会执行
    def __setitem__(self, key, value):
        print('__setitem__执行')
        self.__dict__[key] = value

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

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


fo1 = Fo1()
fo1['name'] = 'ajune'
# print(fo1.name)  
print(fo1['name'])
del fo1['name']

 

posted @ 2019-03-12 21:15  June_King  阅读(374)  评论(0编辑  收藏  举报