在訪問類屬性的時候,有一些方法在需要的時候自動被調用:
# 魔法方法——屬性訪問
__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