Python进阶-类的内置attr属性方法

针对类实例化的对象,才能触发内置属性:__getattr__ __delattr__ __setattr__

class Foo:
    x = 1
    def __init__(self,y):
        self.y = y

    def __getattr__(self, item):   #self为实例对象,item为调用的属性
                                   # __getattr__只有在使用点调用属性
                                   #且属性不存在的时候才会触发
        print('触发__getattr__---->你要调取的属性【%s】不存在'%item)

    def __delattr__(self, item):        #__delattr__删除属性的时候会触发
        print('触发__delattr__---->删除了相关属性')

    def __setattr__(self, key, value):  #__setattr__添加/修改属性会触发它的执行
        print('触发__setattr__---->修改了相关属性')   
        # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写,
        # 就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值
        self.__dict__[key] = value


f = Foo(2)       #实例化相当于赋值操作,则触发__setattr__
f.z = 3          #增加z属性,则触发__setattr__
print(f.y)     #2
f.yyyy         #触发__getattr__---->你要调取的属性【yyy】不存在

del f.x        #触发__delattr__---->删除了相关属性

attr方法的妙用和好处

class Foo:
    x = 1
    def __init__(self,y,tag = False):
        self.y = y
        self.tag = tag

    def __getattr__(self, item): #self为实例对象,item为调用的属性
                     # __getattr__只有在使用点调用属性且属性不存在的时候才会触发
        print('触发__getattr__---->你要调取的属性【%s】不存在'%item)

    def __delattr__(self, item):        #__delattr__删除属性的时候会触发
        if self.tag == True:            #可用来判断用户是否有权限删除属性
            print('已经删除属性【%s】'%item)
            self.__dict__.pop(item)
        else:
            print('无权限删除')

    def __setattr__(self, key, value):  #__setattr__添加/修改属性会触发它的执行
            if type(value) is str:      #可用来判断用户设置的属性是否是指定的类型
                print('已将【%s】属性设置为【%s】'%(key,value))
                self.__dict__[key] = value
            else:
                print('设置的属性不合法!')

f = Foo(2)

# 1 可以用__getattr__来提示用户调用的属性不存在,而不是直接报错
print(f.z)                      #触发__getattr__---->你要调取的属性【z】不存在

# 2 可以用__delattr__来根据用户权限来是否执行删除操作,可以保护类的属性
f1 = Foo(3)
del f1.y                        #因为f1实例没有传入tag权限属性值  ---> 无权限删除
print(f1.__dict__)              #{'y': 3, 'tag': False}
f2 = Foo(4,True)                #传入了tag权限为True,所以可以执行删除操作
del f2.y                        #已经删除属性【y】
print(f2.__dict__)              #{'tag': True}

# 3 可以用__setattr__来规范用户传值类型
f3 = Foo('5')                   #已将【y】属性设置为【5】

你可能感兴趣的:(Python进阶-类的内置attr属性方法)