Le code est le suivant :
# -*- coding:gb2312 -*-
class CarStore(object):
def order(self,car_type):
return Factory.select(car_type)
class Factory(object):
def select(car_type): #为什么这个地方的方法,没有self参数也可以运行?
if car_type == "索纳塔":
return Suonata()
elif car_type == "名图":
return Mingtu()
else:
print("没有您要的车型!")
class Car(object):
def move(self):
print("车在移动...")
def music(self):
print("正在播放音乐...")
def stop(self):
print("车在停止...")
class Suonata(Car):
def __init__(self):
print("索纳塔")
class Mingtu(Car):
def __init__(self):
print("名图")
car_store = CarStore()
suonata = car_store.order("索纳塔")
#car.move()
#car.music()
#car.stop()
suonata.move()
Résultat de l'exécution :
Ce code lui-même ne pose aucun problème et peut être exécuté.
Ma question est pourquoi la septième ligne du code def select(car_type) : peut être exécutée même s'il n'y a pas de self ? Je me souviens que lorsque j'apprenais des cours, on m'avait appris que chaque méthode de la méthode d'instance devait ajouter un paramètre de self, mais il n'y en a pas ici. Ensuite, j'ai ajouté self ici et j'ai commis une erreur, comme indiqué ci-dessous :
Le résultat était une erreur :
Pourquoi cela se produit-il ?
Utilisez-vous python3 ?
En python3, si la fonction membre ne s'ajoute pas, cela signifie que la fonction est une fonction membre statique et peut être appelée directement en utilisant la forme "nom de classe. nom de fonction (paramètre)".
Mais si vous ajoutez self, cette fonction est une fonction membre de la classe. Dans les autres classes appelantes, elle doit être appelée comme ceci : "Nom de la classe. Nom de la fonction (self, paramètre)", ou implémenter une instance dans la classe appelante. , " Nom de l'instance. Nom de la fonction (paramètre)
Python3 est comme ça, mon test, ce n'est pas en python2.
Vous avez ajouté self dans la fonction de sélection, mais lorsque vous l'appelez dans CarStore::order(), vous avez utilisé la forme "nom de classe. nom de fonction (paramètre)", donc c'est incorrect. Lorsque vous appelez CarStore::order(), remplacez-le par "nom de classe. Nom de fonction (auto, paramètre)" ou implémentez une instance dans CarStore::order(), en utilisant le formulaire "nom d'instance. Nom de fonction (paramètre)" Essayez-le.
Je l'ai vu hier soir, il était trop tard, alors je l'ai testé ce matin.
Ce n’est pas obligatoireself
Ce n'est pas magique, vous pouvez le changer en n'importe quel nomself
Selon cette façon d'écrire,
select
是对象方法,调用需要关联一个实例Factory()
。调用时对象实例是与第一个参数car_type
绑定。这个参数名一般约定为self
Cependant, ce n'est pas obligatoire.Vous devez comprendre que les deux méthodes d'appel suivantes sont différentes :
La première façon consiste à utiliser l'objet instance pour appeler le premier paramètre
car_type
自动与实例对象f
绑定;第二种方式,用类去调用,第一个参数(
car_type
)没有绑定;你需要自己绑定才能不出错——也就是你传进去的car_type
:Factory.selct(car_type)
cette ligne.Cependant, lorsque vous ajoutez
self
后,这个函数有两个参数,但是你只绑定了car_type
,也就是绑定到第一个参数self
, le deuxième n'a aucune valeur et quelque chose va forcément mal se passer.Ce que vous devez faire ici, c'est en fait implémenter
select
dans une méthode de classe :Alors, prends
Factory.select(car_type)
调用时,cls
自动绑定到Factory
,而car_type
则绑定到car_type
.Ce qui précède, peu importe
self
还是cls
, ne sont que des noms convenus. Ce qui fonctionne, c'est le modèle class-object-method de Python.Il est recommandé de lire "Analyse du code source Python" pour au moins comprendre comment fonctionne @classmethod, sinon vous ne pourrez pas bien écrire ce type de code.