python-類--魔法方法-屬性的調用

在訪問類屬性的時候,有一些方法在需要的時候自動被調用:

# 魔法方法——屬性訪問

__getattr__(self,name)  # 當用戶試圖獲取一個不存在的屬性時,自動調用該方法

__getattribute__(self,name)     # 當該類屬性被訪問時

__setattr__(self,name,value)    # 當一個屬性被設置時

__delattr__(self,name)      # 當一個屬性被刪除時

例子:

寫一個矩形類,默認有寬、高兩個屬性

如果爲一個叫square的屬性賦值,則說明這是個正方形,此時寬高都重寫爲square的屬性值

class Rectangle:
    # 初始化
    def __init__(self, width=0, height=0):
        self.width = width  # 爲寬賦值,此處也會自動調用__setattr__方法
        self.height = height  # 爲高賦值,此處也會自動調用__setattr__方法

    # 當爲屬性賦值時自動調用
    def __setattr__(self, key, value):
        if key == 'square':
            self.width = value
            self.height = value
        else:
            # 此處不可使用:self.key = value,直接賦值會自動調用本類中改寫過的__setattr__方法,導致無限遞歸
            super().__setattr__(key, value)  # 在這裏調用父類中爲改寫的__setattr__方法,爸爸寫的方法肯定沒啥錯
            # self.__dict__[key] = value   # 也可以這麼寫:__dict__:以字典的形式返回對象的所有屬性和值

    # 返回面積
    def getArea(self):
        return self.width * self.height


運行結果:

>>> c = Rectangle(5,10)
>>> print(c.getArea())
>>> c.square = 10
>>> print(c.getArea())

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