__getattr__
方法詳解__getattr__
的作用
__getattr__
是 Python 的一個魔術方法(Magic Method)。當嘗試訪問一個對象的屬性,而該屬性不存在時,Python 會自動調用此方法。它允許你自定義對不存在屬性的行為。
def __getattr__(self, name: str):
# name 是被訪問的屬性名稱(字符串形式)
...
當對象的屬性查找失敗時(即該屬性不存在時),Python 會調用 __getattr__
方法來處理。這通常用於動態生成屬性或提供默認行為。
__dict__
中查找屬性。__getattr__
方法。__getattr__
方法,則調用該方法,並將屬性名稱作為參數傳遞。__getattr__
方法也未處理該屬性,則會引發 AttributeError
。以下是一個簡單的例子來說明 __getattr__
的實際用法:
class MyClass:
def __init__(self):
self.existing_attribute = "I exist!"
def __getattr__(self, name):
# 當屬性不存在時,返回一條信息
return f"Attribute '{name}' not found!"
# 創建對象
obj = MyClass()
# 訪問存在的屬性
print(obj.existing_attribute) # I exist!
# 訪問不存在的屬性,觸發 __getattr__
print(obj.some_missing_attribute) # Attribute 'some_missing_attribute' not found!
__getattribute__
的區別除了 __getattr__
,Python 還有一個相關的方法是 __getattribute__
。它們的區別如下:
方法名稱 | 調用時機 | 應用場景 |
---|---|---|
__getattr__ |
當屬性不存在時才會被調用 | 用於提供對不存在屬性的默認行為或動態生成屬性。 |
__getattribute__ |
所有屬性訪問(無論屬性是否存在)時都會被調用 | 用於攔截對所有屬性的訪問,實現更高級別的屬性控制,但需要謹慎使用以避免無限遞歸。 |
class MyClass:
def __getattribute__(self, name):
return f"Accessing attribute '{name}'"
def __getattr__(self, name):
return f"Attribute '{name}' not found!"
obj = MyClass()
print(obj.existing_attribute) # Accessing attribute 'existing_attribute'
print(obj.some_missing_attribute) # Accessing attribute 'some_missing_attribute'
__getattr__
或 __getattribute__
中,若直接訪問對象的屬性(例如 self.name
),會再次觸發這些方法,進而導致無限遞歸。應該使用 super()
或訪問底層的 __dict__
處理。
class MyClass:
def __getattr__(self, name):
# 使用 __dict__ 來避免無限遞歸
return self.__dict__.get(name, f"Attribute '{name}' not found!")
在 Python 中,__getattr__
是一個魔術方法,用於當屬性不存在時自定義其行為。這使得我們可以動態地處理屬性訪問,並增強類的靈活性。但在使用時需要注意避免無限遞歸問題,並區分其與 __getattribute__
的使用場景。