Un novice en programmation interrogé sur les paramètres des méthodes de classe en python
欧阳克
欧阳克 2017-06-22 11:52:02
0
4
956

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 ?

欧阳克
欧阳克

温故而知新,可以为师矣。 博客:www.ouyangke.com

répondre à tous(4)
巴扎黑

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.

三叔

self Ce n'est pas magique, vous pouvez le changer en n'importe quel nom

Ce n’est pas obligatoire

self

为情所困
4 return Factory.select(self, car_type)
Ty80
class Factory(object):        
    def select(car_type):
        if car_type == "索纳塔":
            return Suonata()
        elif car_type == "名图":
            return Mingtu()
        else:
            print("没有您要的车型!")

Selon cette façon d'écrire, select是对象方法,调用需要关联一个实例Factory()。调用时对象实例是与第一个参数car_type绑定。这个参数名一般约定为selfCependant, ce n'est pas obligatoire.

Vous devez comprendre que les deux méthodes d'appel suivantes sont différentes :

f = Factory()
f.select(xxx)

Factory.select(xxx)

La première façon consiste à utiliser l'objet instance pour appeler le premier paramètre car_type自动与实例对象f绑定;
第二种方式,用类去调用,第一个参数(car_type)没有绑定;你需要自己绑定才能不出错——也就是你传进去的car_typeFactory.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 :

class Factory(object):   

    @classmethod     
    def select(cls, car_type):
        if car_type == "索纳塔":
            return Suonata()
        elif car_type == "名图":
            return Mingtu()
        else:
            print("没有您要的车型!")

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal