从装饰类访问静态字段

时间:2017-12-19 16:56:50

标签: python class class-decorator

完整代码示例:

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'

是否可以从装饰类访问静态字段?

2 个答案:

答案 0 :(得分:3)

虽然@martineau的答案可能更好地解决了您尝试解决的具体问题,但更通用的方法可能是使用创建元类来重新定义实例方法{{1}在__getattr__实例上(类是type的实例)。

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 传递。

答案 1 :(得分:1)

您可以通过让装饰器从正在装饰的派生的派生来实现它。

这就是我的意思:

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