Heim >Backend-Entwicklung >Python-Tutorial >Wie rufe ich statische Klassenmethoden innerhalb des Klassenkörpers in Python-Versionen <= 3.9 auf?

Wie rufe ich statische Klassenmethoden innerhalb des Klassenkörpers in Python-Versionen <= 3.9 auf?

DDD
DDDOriginal
2024-10-18 06:42:02689Durchsuche

How to Call Class Staticmethods within the Class Body in Python Versions <= 3.9?

Python-Version <= 3.9: Aufruf einer statischen Klassenmethode innerhalb des Klassenkörpers

Problem:

Beim Versuch, eine statische Methode aus dem Klassenkörper heraus mit dem Staticmethod-Dekorator aufzurufen, werden Staticmethod-Objekte als nicht aufrufbar befunden, was zu einem TypeError führt. Dieses Verhalten tritt aufgrund der Deskriptorbindung auf.

Problemumgehung:

Eine Problemumgehung besteht darin, die statische Methode nach ihrer letzten Verwendung manuell in eine statische Methode umzuwandeln:

<code class="python">class Klass(object):

    def _stat_func():
        return 42

    _ANS = _stat_func()  # Use the non-staticmethod version

    _stat_func = staticmethod(_stat_func)  # Convert function to a static method

    def method(self):
        ret = Klass._stat_func() + Klass._ANS
        return ret

Sauberere Python-Methode:

Für Python-Versionen <= 3.9 kann man das __func__-Attribut von staticmethod-Objekten verwenden, um die Rohfunktion aufzurufen:

<code class="python">class Klass(object):

    @staticmethod  # Use as decorator
    def stat_func():
        return 42

    _ANS = stat_func.__func__()  # Call the staticmethod

    def method(self):
        ret = Klass.stat_func()
        return ret

Für Python-Versionen >= 3.10:

In Python-Versionen 3.10 und höher können staticmethod-Funktionen ohne Probleme direkt aus dem Klassenbereich aufgerufen werden.

Das obige ist der detaillierte Inhalt vonWie rufe ich statische Klassenmethoden innerhalb des Klassenkörpers in Python-Versionen <= 3.9 auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn