045魔法方法:属性访问
屬性訪問:
__getattr__(self,name)
? 定義當用戶試圖獲取一個不存在的屬性時的行為
__getattribute__(self,name)
? 定義當該類的屬性被訪問時的行為
__setattr__(self,name,value)
? 定義當用一個屬性被設置時的行為
__delattr__(self,name)
? 定義當用一個屬性被刪除時的行為
例:>>> class C:
? ...???? def __getattribute__(self, name):
????????? # 使用 super() 調用 object 基類的 __getattribute__ 方法
? ...???????? print('getattribute')
? ...???????? return super().__getattribute__(name)
? ...??? ?
? ...???? def __setattr__(self, name, value):
? ...???????? print('setattr')
? ...???????? super().__setattr__(name, value)
? ...???? def __delattr__(self, name):
? ...???????? print('delattr')
? ...???????? super().__delattr__(name)
? ...???? def __getattr__(self, name):
? ...???????? print('getattr')
? ...
? >>> c = C()
? >>> c.x
? getattribute
? getattr
? >>> c.x = 1
? setattr
? >>> c.x
? getattribute
? 1
? >>>del c.x
? delattr
練習:
寫一個矩形類,默認有寬和高兩個屬性;
如果為一個叫square的屬性賦值,那么說明這是一個正方形,值就是正方形的邊長,此時寬和高都應該等于邊長。
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:
??????????? self.__dict__[name] = value?? #注意,避免進入死循環
?
??? def getArea(self):
??????? return self.width * self.height
轉載于:https://www.cnblogs.com/wangjiaxing/p/4896672.html
總結
以上是生活随笔為你收集整理的045魔法方法:属性访问的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javaweb 之javascript
- 下一篇: Delphi中点击DBGrid某一行获得