-3
votes

Comment les parenthèses fonctionnent-elles exactement en ce qui concerne les cours, les méthodes et les instances de Python?

Les classes, les méthodes et les instances ont moi soigneusement confus. Pourquoi cela fonctionne-t-il: xxx

mais ce n'est pas ?: xxx

mais, si vous modifiez le code directement ci-dessus pour inclure L'instance comme argument lors de l'appelant la méthode, comme: xxx

Ça fonctionne? Je vois la différence entre les deux, mais je ne comprends pas.


3 commentaires

En réalité instance.method () fait un appel à classe.method (instance) en arrière-plan. (Ce comportement pourrait être modifié par des décorateurs.)


COM1 est une instance de la classe ordinateur . Ils ne sont pas interchangeables.


Cette question a déjà des réponses ici: TypeError: Un argument de position requis


3 Réponses :


0
votes

dans votre exemple ordinateur.config code> est une méthode d'instance, signifie qu'il est lié à un objet, ou en d'autres termes nécessite strong> un objet. Par conséquent, dans votre deuxième exemple, vous écririez:

class Computer
    @staticmethod
    def config():
        print("Foo")

Computer.config()  # no object required at all, because its a staticmethod


3 commentaires

Je suis toujours un peu confus. Si ordinateur.config est lié à un objet, ce qui en fait une méthode d'instance, alors quel est com1.config () sinon une méthode d'instance? Et ce qui fait une méthode d'instance? Je pensais qu'un cas d'une classe n'était que la création de l'objet? Désolé, je trouve que je trouve qu'il est difficile de comprendre.


Aucun classificateur d'un tout autour d'une méthode ne le rend Toujours une méthode d'instance qui nécessite un objet. Seuls staticmethod et ClassMethod Les créer des méthodes non liées qui sont souvent utilisées comme des fonctions de conviction pour certaines tâches


Pour résumer, com1.config () ou ordinateur.config (COM1) est exactement identique, mais d'abord est préféré et signifie la méthode d'instance. Seule ma dernière méthode vous montre comment faire une méthode non instance



-1
votes

Pourquoi la deuxième approche ne fonctionne-t-elle pas?

parce que ordinateur est une instance de quelque chose appelé une méta-classe. C'est quelque peu la définition de la classe et non une instance de ordinateur . COM1 est une instance créée par ordinateur . Vous pouvez utiliser com1 pour appeler ses fonctions non statiques, mais vous ne pouvez pas utiliser l'ordinateur de la méta-classe pour invoquer des fonctions non statiques, qui nécessitent un objet à courir. sur.

Pourquoi la troisième approche fonctionne-t-elle?

Avez-vous remarqué le auto dans la définition de la fonction config ? Cela signifie que lorsque vous invoquez com1.config () ce que vous faites réellement est d'appeler config avec COM1 comme argument. Donc com1.config () est identique à celui ordinateur.config (COM1) .


3 commentaires

ordinateur est une classe , pas une métaclasse. Une métaclasse est autre chose.


@khelwood ordinateur , lorsqu'il est utilisé comme objet, est une instance d'une méta-classe. C'est une classe mais une instance de méta-classe. Le deuxième code utilise un ordinateur comme une instance de sorte qu'il se comporte comme une instance d'une méta-classe.


Si vous pensez qu'il est important d'expliquer comment les classes sont des cas de métaclasses, d'accord, mais c'est assez non pertinent pour la question. Mais votre réponse dit toujours "l'ordinateur de la méta-classe" au lieu de "la classe ordinateur".



0
votes

Ceci est parce que config () est une méthode d'instance et non une méthode statique. Une méthode d'instance, il suffit de dire, est partagée sur tous les objets d'une classe et ne peut être accessible en utilisant simplement le nom de la classe. Si vous souhaitez appeler config () en utilisant simplement le nom de la classe, vous devez dire au compilateur qu'il est statique. Pour faire cette utilisation @staticmeThod étiquette et supprimez l'argument auto : xxx

et comme vous l'avez dit:

Si vous modifiez le code directement ci-dessus pour inclure l'instance en tant que argument lors de l'appelant la méthode, comme:

Ceci est parce que chaque fonction d'instance prend auto car il s'agit d'un premier argument. Fondamentalement auto est un peu similaire à Ceci en C ++ ou Java, et indique quel objet fonctionner sur, c'est-à-dire, auto agit comme un pointeur à l'objet actuel. Lorsque vous avez passé l'objet COM1 à l'argument, il s'est fallu pour COM1 .

Cela signifie que lorsque vous invoquez com1.config ( ) Ce que vous faites réellement est d'appeler config avec COM1 comme argument. Donc com1.config (((() est identique à celui ordinateur.config (COM1) .


0 commentaires