1、__getattr__ 的用法
当实例对象访问一个不存在的属性时,会执行
__getattr__方法,如果属性存在的话,就不会执行
案例
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def 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 = name
self.age = age
def 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 = name
self.age = age
def 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 = name
self.age = age
def 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 属性不可被访问
"""
323

被折叠的 条评论
为什么被折叠?



