面向對象--07屬性訪問的魔法方法

重寫一下四個魔法方法,即可控制對象的屬性訪問



1.__getattr__(self,name)
定義當用戶試圖獲取一個不存在的屬性時的行爲

2.__getattribute__(self,name)
定義當該類的屬性被訪問時的行爲(先於__getattr__(self,name)執行)

3.__setattr__(self,name,value)
定義當一個屬性被設置時的行爲

4.__delattr__(self,name)

定義一個屬性被刪除時的行爲

例一

class C:
    def __getattribute__(self,name):
        print('getattrbute')
        return super().__getattribute__(name)
    def __getattr__(self,name):
        print('getattr')
    def __setattr__(self,name,value):
        print('setattr')
        super().__setattr__(name,value)
    def __delattr__(self,name):
        print('delattr')
>>> c = C()
>>> c.x=2
setattr
>>> c.s
getattrbute

getattr


例二

class Rectangle:
    def __init__(self,width=0,height=0):
        self.width = width
        self.height = height
    def __setattr__(self,name,value):
        if name == 'square':
            self.width = value
            self.height = value
        else:
            super().__setattr__(name,value)   #或者改爲self.__dict__[name] = value
            #對象有一個特殊屬性.__dict__ 作用是以字典的形式顯示當前對象所有的屬性以及對應的值 
 
>>> c=Rectangle()
>>> c.square=10
>>> c.height
10
>>> c.width
10
>>>
>>> c.__dict__
{'width': 10, 'height': 10}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章