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 属性不可被访问
"""