Décorer une classe en Python par définition le décorateur comme une classe

Ce qui est un simple exemple de la décoration d'une classe en définissant le décorateur en tant que classe?

Je suis en train de réaliser ce qui a été mis en œuvre dans la version 2.6 de Python à l'aide de PEP 3129 à l'exception de l'aide de classes de fonctions pas comme Bruce Eckel explique ici.

Les ouvrages suivants:

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

Sauf, dans ce qui précède, wrappedClass n'est pas une classe, mais une fonction manipulé pour retourner un type de classe. Je voudrais écrire la même appelable comme suit:

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

Comment ceci pourrait-il être fait?

Je ne suis pas entièrement sûr de ce qui se passe dans """... un peu de code ici ..."""

Avez-vous essayé le code que vous avez posté, vous-même? Il devrait fonctionner.
La première partie à l'aide de la fonction de travail. Comment pourrais-je écrire wrappedClass comme une véritable classe?
Quel est votre décorateur censé faire? Je ne peux pas vous dire quel est le code a pour aller dans "code ici" sans savoir ce que ce code est censé faire.
Je veux réaliser ce qui peut être réalisé avec une fonction à l'aide d'une classe. Je comprends que cela peut être fait, mais je ne trouve pas d'exemples pour illustrer cette
Je n'ai pas l'obtenir. Le code dans votre deuxième extrait de code devrait fonctionner comme il est. Vous pouvez mettre juste aucun code "un code ici". Comment suis-je censé maintenant ce que ce code est censé faire? Si vous ne voulez pas écraser __init__(), n'ont tout simplement pas. Si vous voulez le remplacer, manifestement, vous voulez changer son comportement, d'une certaine façon. Je pose la question: De quelle manière?

OriginalL'auteur tsps | 2012-03-28