Die statische Methode entspricht einer in einer Klasse definierten Funktion. Wenn sich eine Methode also weder auf eine Instanz noch auf eine bestimmte Klasse bezieht, wird empfohlen, sie als statische Methode zu definieren. Dadurch wird der Code nicht nur klarer Blick, sondern erleichtert auch die Wartung des Codes.
Der Parameter, der implizit an die aufrufende Methode der Unterklasse übergeben wird, ist die dem Objekt entsprechende Klasse, und die Klassenvariable der entsprechenden Klasse wird während des Aufrufvorgangs dynamisch generiert.
Verstehen Sie, dass die Klassen „classicmethod“ und „staticmethod“ eine Datenstruktur sind, die Objekte erstellen kann. Beim Aufruf einer Klasse wird ein Instanzobjekt der Klasse erstellt. Sobald das Objekt erstellt ist, prüft Python, ob die init()-Methode implementiert ist. Wenn init() implementiert wurde, wird es aufgerufen und das Instanzobjekt als ersten Parameter (self) übergeben.
Definieren Sie beispielsweise eine Klasse Date, die Datumsinformationen speichert, und die Initialisierungsfunktion wird hier neu definiert.
class Date(object): day = 0 month = 0 year = 0 def __init__(self, day=0, month=0, year=0): self.day = day self.month = month self.year = year def tellDate(self): print 'Today is %s-%s-%s'%(self.day,self.month,self.year)
Wenn wir die Methode „tell Date“ aufrufen müssen, müssen wir zuerst eine Instanz erstellen oder Date().tellDate() verwenden
date1 = Date() date1.tellDate()
So rufen Sie die Funktion direkt mit dem Klassennamen auf ?
Sie können @classmethod oder @staticmethod verwenden, um den Klassennamen aufzurufen. Methodenname () ruft die Funktion auf
Nehmen Sie nun an, dass wir viele Datumsinstanzen erstellen müssen und die Datumsinformationen übergeben werden von außen in Form einer Zeichenfolge ein, das Format ist „TT-MM-JJJJ“. Was muss getan werden
Analysieren Sie die Datumsinformationszeichenfolge in ein Tupel mit drei Variablen: Jahr, Monat und Tag
Übergeben Sie beim Instanziieren eines Date-Objekts das Jahr, den Monat und den Tag als Parameter.
So:
day, month, year = map(int, string_date.split('-')) date1 = Date(day, month, year)
Python kann nicht wie C++ überladen werden, daher führen wir die Klassenmethode ein, die keinen self-Parameter erfordert, aber erfordert, dass der erste Parameter cls ist, der seine eigene Klasse darstellt Parameter.
@classmethod def from_string(cls, date_as_string): day, month, year = map(int, date_as_string.split('-')) date1 = cls(day, month, year) return date1
Sie können den Klassennamen Methodennamen () direkt verwenden
Die Vorteile einer solchen Programmierung sind:
Die String-Zerlegungsoperation kann wiederverwendet werden, und zwar nur muss den Parameter einmal übergeben;
OOP; weil es sich um die Klasse selbst handelt, nicht um eine Instanz der Klasse. Wenn wir Date als übergeordnete Klasse verwenden, haben ihre Unterklassen auch den from_string Methode
Der Klassenmethode sehr ähnlich, ist die statische Methode, aber sie erfordert nicht, dass self ihr eigenes Objekt und cls-Parameter ihrer eigenen Klasse darstellt, genau wie bei der Verwendung einer Funktion.
@staticmethod def is_date_valid(date_as_string): day, month, year = map(int, date_as_string.split('-')) return day <= 31 and month <= 12 and year <= 3999
Alle Programme und Laufergebnisse
class Date(object): day = 0 month = 0 year = 0 def __init__(self, day=0, month=0, year=0): self.day = day self.month = month self.year = year def tellDate(self): print 'Today is %s-%s-%s'%(self.day,self.month,self.year) @classmethod def from_string(cls, date_as_string): day, month, year = map(int, date_as_string.split('-')) date = cls(day, month, year) return date @staticmethod def is_date_valid(date_as_string): day, month, year = map(int, date_as_string.split('-')) return day <= 31 and month <= 12 and year <= 3999 if __name__ == '__main__': date1 = Date() date1.tellDate() date2 = Date.from_string("14-04-2016") date2.tellDate() print Date.is_date_valid("14-04-2016")
Die Laufergebnisse sind:
Today is 0-0-0 Today is 14-4-2016 True
Das obige ist der detaillierte Inhalt vonFür Anfänger, wie man @classmethod und @staticmethod versteht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!