我的设置如下
class decorator:
def __init__(self, fn):
self.fn = fn
@staticmethod
def wrap(fn):
return decorator(fn)
def __call__(self):
print(f"decorator {self} function called")
class A:
@decorator.wrap
def foo(self):
print(f"Object {self} called")
def __init__(self):
self.boo = 'Boo'
如何从装饰器对象访问 boo
变量?
最佳答案
@S.B 的解决方案有效,但不是线程安全的,因为 A
的多个实例可能会在不同线程中同时调用 foo
方法,从而覆盖在调用源自另一个实例的 __call__
方法之前装饰器对象的 instance
属性。
线程安全的方法是从 __get__
方法返回一个包装函数,并通过闭包提供可用的实例:
class decorator:
def __init__(self, fn):
self.fn = fn
def __get__(self, instance, owner=None):
def wrapper(*args, **kwargs):
print(f'decorator {self} function called; boo = {instance.boo}')
return self.fn(instance, *args, **kwargs)
return wrapper
class A:
@decorator
def foo(self):
print(f"Object {self} called")
def __init__(self):
self.boo = 'Boo'
A().foo()
输出:
decorator <__main__.decorator object at 0x7f6ef3316c10> function called; boo = Boo
Object <__main__.A object at 0x7f6ef3339580> called
关于python - Python中从子对象访问父对象数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77311656/