針對類實例化的對象,才能觸發內置屬性:__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】
