从装饰器访问静态字段 class
Accessing static fields from the decorated class
完整代码示例:
def decorator(class_):
class Wrapper:
def __init__(self, *args, **kwargs):
self.instance = class_(*args, **kwargs)
@classmethod
def __getattr__(cls, attr):
return getattr(class_, attr)
return Wrapper
@decorator
class ClassTest:
static_var = "some value"
class TestSomething:
def test_decorator(self):
print(ClassTest.static_var)
assert True
尝试执行测试时,出现错误:
test/test_Framework.py F
test/test_Framework.py:37 (TestSomething.test_decorator)
self = <test_Framework.TestSomething object at 0x10ce3ceb8>
def test_decorator(self):
> print(ClassTest.static_var)
E AttributeError: type object 'Wrapper' has no attribute 'static_var'
是否可以从装饰器访问静态字段class?
您可以通过让装饰器从被装饰的装饰器创建一个 class derived 来让它工作。
我的意思是:
def decorator(class_):
class Wrapper(class_):
def __init__(self, *args, **kwargs):
self.instance = super().__init__(*args, **kwargs)
return Wrapper
@decorator
class ClassTest:
static_var = "some value"
print(ClassTest.static_var) # -> some value
虽然@martineau 的回答可能更好地解决了您要解决的具体问题,但更通用的方法可能是使用创建元class 来重新定义 实例 方法 __getattr__
在 type
实例上(并且 classes 是 type
的实例)。
def decorator(class_):
class WrapperMeta(type):
def __getattr__(self, attr):
return getattr(class_, attr)
class Wrapper(metaclass=WrapperMeta):
def __init__(self, *args, **kwargs):
self.instance = class_(*args, **kwargs)
return Wrapper
这允许 class 本身的属性查找通过 WrapperMeta.__getattr__
传递。
完整代码示例:
def decorator(class_):
class Wrapper:
def __init__(self, *args, **kwargs):
self.instance = class_(*args, **kwargs)
@classmethod
def __getattr__(cls, attr):
return getattr(class_, attr)
return Wrapper
@decorator
class ClassTest:
static_var = "some value"
class TestSomething:
def test_decorator(self):
print(ClassTest.static_var)
assert True
尝试执行测试时,出现错误:
test/test_Framework.py F
test/test_Framework.py:37 (TestSomething.test_decorator)
self = <test_Framework.TestSomething object at 0x10ce3ceb8>
def test_decorator(self):
> print(ClassTest.static_var)
E AttributeError: type object 'Wrapper' has no attribute 'static_var'
是否可以从装饰器访问静态字段class?
您可以通过让装饰器从被装饰的装饰器创建一个 class derived 来让它工作。
我的意思是:
def decorator(class_):
class Wrapper(class_):
def __init__(self, *args, **kwargs):
self.instance = super().__init__(*args, **kwargs)
return Wrapper
@decorator
class ClassTest:
static_var = "some value"
print(ClassTest.static_var) # -> some value
虽然@martineau 的回答可能更好地解决了您要解决的具体问题,但更通用的方法可能是使用创建元class 来重新定义 实例 方法 __getattr__
在 type
实例上(并且 classes 是 type
的实例)。
def decorator(class_):
class WrapperMeta(type):
def __getattr__(self, attr):
return getattr(class_, attr)
class Wrapper(metaclass=WrapperMeta):
def __init__(self, *args, **kwargs):
self.instance = class_(*args, **kwargs)
return Wrapper
这允许 class 本身的属性查找通过 WrapperMeta.__getattr__
传递。