Detaillierte Erläuterung der Verwendung des Python-Dekorators @classmethod

Ein Dekorator ist im Wesentlichen eine Python-Funktion, die es anderen Funktionen ermöglicht, zusätzliche Funktionen hinzuzufügen, ohne Codeänderungen vorzunehmen. Der Rückgabewert des Dekorators ist ebenfalls ein Funktionsobjekt. Es wird häufig in Szenarien mit übergreifenden Anforderungen verwendet, z. B. Protokolleinfügung, Leistungstests, Transaktionsverarbeitung, Caching, Berechtigungsüberprüfung usw. Dekoratoren sind ein hervorragendes Design zur Lösung dieser Art von Problemen. Mit Dekoratoren können wir eine große Menge ähnlichen Codes extrahieren, der nichts mit der Funktion selbst zu tun hat, und ihn weiterhin wiederverwenden.

Kurz gesagt besteht die Funktion eines Dekorateurs darin, einer vorhandenen Funktion oder einem vorhandenen Objekt zusätzliche Funktionalität hinzuzufügen.

1. Wie schreibt man einen Dekorateur?

In den frühen Tagen (Python-Version < 2.4, vor 2004) wurde das Hinzufügen zusätzlicher Funktionalität zu einer Funktion wie folgt geschrieben.

def debug(func):
    def wrapper():
        print "[DEBUG]: enter {}()".format(func.__name__)
        return func()
    return wrapper
 
def say_hello():
    print "hello!"
 
say_hello = debug(say_hello)  # 添加功能并保持原函数名不变
Die obige Debug-Funktion ist eigentlich ein Dekorator. Sie umschließt die ursprüngliche Funktion, gibt eine andere Funktion zurück und fügt einige zusätzliche Funktionen hinzu. Da das Schreiben auf diese Weise nicht sehr elegant ist, unterstützen spätere Versionen von Python @-syntaktischen Zucker. Der folgende Code entspricht der früheren Schreibweise.
def debug(func):
    def wrapper():
        print "[DEBUG]: enter {}()".format(func.__name__)
        return func()
    return wrapper
 
@debug
def say_hello():
    print "hello!"

Dies ist der einfachste Dekorator, aber es gibt ein Problem: Wenn die dekorierte Funktion Parameter übergeben muss, funktioniert dieser Dekorator nicht. Da die zurückgegebene Funktion keine Parameter akzeptieren kann, können Sie angeben, dass die Dekoratorfunktion wrapperdieselben Parameter wie die Originalfunktion akzeptiert, zum Beispiel:

def debug(func):
    def wrapper(something):  # 指定一毛一样的参数
        print "[DEBUG]: enter {}()".format(func.__name__)
        return func(something)
    return wrapper  # 返回包装过函数
 
@debug
def say(something):
    print "hello {}!".format(something)
Auf diese Weise lösen Sie ein Problem, haben aber N weitere Probleme. Da es Tausende von Funktionen gibt, kümmern Sie sich nur um Ihre eigene Funktion. Wer weiß, wie die Funktionsparameter anderer Leute aussehen? Glücklicherweise bietet Python variable Parameter *argsund Schlüsselwortparameter **kwargs. Mit diesen beiden Parametern kann der Dekorator für jede Zielfunktion verwendet werden.
def debug(func):
    def wrapper(*args, **kwargs):  # 指定宇宙无敌参数
        print "[DEBUG]: enter {}()".format(func.__name__)
        print 'Prepare and say...',
        return func(*args, **kwargs)
    return wrapper  # 返回
 
@debug
def say(something):
    print "hello {}!".format(something)

An diesem Punkt beherrschen Sie die grundlegende Methode zum Schreiben von Dekorateuren vollständig.

2. Eingebaute Dekorelemente

@classmethod ist ein Dekorator in Python, der zum Definieren von Klassenmethoden verwendet wird. Eine Klassenmethode ist eine Methode, die einer Klasse und nicht einer Instanz zugeordnet ist und direkt über den Klassennamen aufgerufen werden kann, ohne zuerst eine Instanz zu erstellen.

Supongo que te gusta

Origin blog.csdn.net/Mr_wilson_liu/article/details/132544207
Recomendado
Clasificación