Méthodes de classe, méthodes statiques et méthodes d'instance en Python

Méthodes de classe, méthodes statiques et méthodes d'instance

1. Exemple de méthode

Définissez d'abord une classe Date qui génère la date, puis développez le contenu en fonction de cette classe.

class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
	def __str__(self):
        return "{year}/{month}/{day}".format(year=self.year,month=self.month,say=self.day)
    
if __name__ == "__main__":
    new_day = Date(2018,12,30)
    print(new_day) # 2018/12/30   

Définis dans la classe sont l'exemple de la méthode dans des circonstances ordinaires, comme dans le code ci __init__()- dessus et __str__()sont des exemples de méthodes.

Par exemple Date, définissez une nouvelle méthode d'instance dans la classe au début tomorrow. Cette méthode augmente le nombre de dates de un (la date n'est pas jugée ici par simplicité).

def tomorrow(self):
    self.day += 1
    
if __name__ == "__main__":
    new_day = Date(2018,12,30)
    new_day.tomorrow() # python会自动转换成tomorrow(new_day)这种形式
    print(new_day) # 2018/12/31  

La méthode d'instance consiste à opérer sur l'instance, l'image self.变量+赋值符号devient la variable de l'objet d'instance et il est nécessaire de modifier la variable de classe 类名.变量+赋值符号.

Deux, méthode statique

Commencez par introduire un tel scénario, en supposant que Datele paramètre de chaîne transmis par la classe 2018-12-31ressemble à ceci. Les paramètres entrants que nous avons définis au début sont séparés par des virgules, donc cela ne fonctionnera certainement pas.

Pour atteindre cet objectif, le moyen le plus simple de penser est d'utiliser une splitfonction pour traiter la chaîne avant de la mettre.

date_str = "2018-12-30"
year, month, day = tuple(data_str.split("-"))
# print(year,month,day) # 2018 12 30
new_day = Date(int(year),int(month),int(day))
print(new_day) # 2018/12/30

Il est concevable que la Dateclasse ne fournisse pas de méthode pour convertir une chaîne en entrée standard. Il existe donc un moyen de le traiter d'abord, puis de le saisir.

Cette méthode pose un gros problème, c'est-à-dire qu'à chaque fois que la Dateclasse est instanciée, un morceau de code (ie year, month, day = tuple(data_str.split("-"))) qui gère la chaîne doit être ajouté .

Mais en fait, nous pouvons mettre cette logique dans la classe, c'est-à-dire définir des méthodes statiques.

@staticmethod
def parse_from_string(data_str):
    year, month, day = tuple(data_str.split("-"))
    return Date(int(year),int(month),int(day))

La pythonméthode statique n'a pas besoin de recevoir self.

Comme il se trouve dans Datel'espace de noms de la classe, utilisez Date.parse_from_string()pour appeler

#用staticmethon完成初始化
new_day = Date.prase_from_string(date_str)
print(new_day) # 2018/12/30

À ce stade, le code devient concis et une nouvelle logique peut être ajoutée à la méthode statique. Mais l'inconvénient des méthodes statiques est qu'elles sont codées en dur. Si le nom de la classe est modifié NewDate, alors le retour de la méthode statique Datechangera également NewDate. Ce sera gênant lorsqu'il y a beaucoup de classes.

Il existe donc des méthodes de classe en Python.

Trois, méthode de classe

@classmethod
def from_string(cls,data_str):
    year, month, day = tuple(data_str.split("-"))
    return cls(int(year),int(month),int(day))

__init__(self)Ce qui est passé selffait référence à l'objet et ce qui est from_string()passé clsfait référence à la classe elle-même. Donc cette fois returnn'a rien à voir avec le nom de la classe.

#用classmethon完成初始化
new_day = Date.prase_from_string(date_str)
print(new_day) # 2018/12/30

Pensons-nous classmethodqu'il peut être complètement remplacé staticmethod?

staticmethodBien sûr, il existe d'autres utilisations. Imaginons un autre scénario pour déterminer si la chaîne est légale. C'est classmethodégalement possible, mais réfléchissez-y davantage: la logique du jugement n'a pas besoin de renvoyer l'objet string, et il n'est pas nécessaire classmethonde le clstransmettre.

@staticmethod
def valid(data_str):
    year, month, day = tuple(data_str.split("-"))
    if int(year)>0 and (int(month)>0 and month<=12) and (int(day)>0 and int(day)<=31) #简单的逻辑,实际中判断是否合法不是这样的
    	return True
    elsereturn False
    
print(Date.valid_str("2018-12-32")) # False    

Sous-section

Méthode statique, un décorateur doit être ajouté avant la méthode de classe

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43901214/article/details/106911827
conseillé
Classement