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】

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM