Украсьте класс в Python, определив декоратор как класс.

Каков простой пример декорирования класса путем определения декоратора как класса?

Я пытаюсь добиться того, что было реализовано в Python 2.6, используя PEP 3129, за исключением того, что я использую классы, а не функции, как объясняет Брюс Эккель здесь.

Работает следующее:

class Decorator(object):
    def __init__(self, arg):
        self.arg = arg

    def __call__(self, cls):
        def wrappedClass(*args):
            return cls(*args)
        return type("TestClass", (cls,), dict(newMethod=self.newMethod, classattr=self.arg))

    def newMethod(self, value):
        return value * 2

@Decorator("decorated class")
class TestClass(object):
    def __init__(self):
        self.name = "TestClass"
        print "init %s"%self.name

    def TestMethodInTestClass(self):
        print "test method in test class"

    def newMethod(self, value):
        return value * 3

За исключением приведенного выше, wrapClass — это не класс, а функция, которой манипулируют для возврата типа класса. Я хотел бы написать тот же callable следующим образом:

def __call__(self, cls):
        class wrappedClass(cls):
            def __init__(self):
                ... some code here ...
        return wrappedClass

Как это сделать?

Я не совсем уверен, что входит в """... здесь какой-то код..."""

18
задан Peter Mortensen 20 May 2018 в 08:34
поделиться