1、__getattr__
的用法
當實例對象訪問一個不存在的屬性時,會執行
__getattr__
方法,如果屬性存在的話,就不會執行
案例
class Person:def __init__(self, name, age):self.name = nameself.age = agedef get_info(self):return f"name: {self.name}, age: {self.age}"def __getattr__(self, item):return f"獲取屬性 {item}"p = Person("Jack", 19)
print(p.name) # Jack
print(p.xxx) # 獲取屬性 xxx
2、__getattribute__
的用法
不管訪問的屬性是否存在,一律執行此方法
也被稱為屬性攔截器
案例
class Person:def __init__(self, name, age):self.name = nameself.age = agedef get_info(self):return f"name: {self.name}, age: {self.age}"def __getattribute__(self, item):return f"獲取屬性 {item}"p = Person("Jack", 19)
print(p.name) # 獲取屬性 name
print(p.xxx) # 獲取屬性 xxx
3、__getattr__
和 __getattribute__
聯合使用
class Person:def __init__(self, name, age):self.name = nameself.age = agedef get_info(self):return f"name: {self.name}, age: {self.age}"def __getattr__(self, item):return f"屬性 {item} 不存在"def __getattribute__(self, item):print(f"__getattribute__ {item}")return super().__getattribute__(item)p = Person("Jack", 19)
print(p.xxx) # 獲取屬性 xxx
4、__getattribute__
又被稱為屬性攔截器
class Person:def __init__(self, name, age):self.name = nameself.age = agedef get_info(self):return f"name: {self.name}, age: {self.age}"def __getattribute__(self, item):print(f"__getattribute__ {item}")if item == "age":return f"{item} 屬性不可被訪問"return super().__getattribute__(item)p = Person("Jack", 19)
print(p.age)
"""
__getattribute__ age
age 屬性不可被訪問
"""