attrs包没有与on_getattr直接等效的功能。但是,可以通过定义自己的__getattr__方法来实现类似的行为。例如:
import attr
@attr.s
class MyClass:
a = attr.ib(default=1)
b = attr.ib(default=2)
def __getattr__(self, attr):
if attr == 'c':
return self.a + self.b
return object.__getattribute__(self, attr)
my_obj = MyClass()
print(my_obj.c) # 输出 3
在这个示例中,通过重写定义了__getattr__方法,当对象尝试访问属性c时,该方法将返回a和b的和。对于其他属性,该方法将调用父类的__getattribute__方法。
需要注意的是,__getattr__方法只有在访问不存在的属性时才会被调用。如果属性存在,将会直接调用该属性的getter方法。因此,如果使用attr.ib定义属性,建议在调用__getattr__前先检查该属性是否存在。