Les classes, les méthodes et les instances ont moi mais ce n'est pas ?: p> mais, si vous modifiez le code directement ci-dessus pour inclure L'instance comme argument lors de l'appelant la méthode, comme: p> Ça fonctionne? Je vois la différence entre les deux, mais je ne comprends pas. P> p>
3 Réponses :
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
Je suis toujours un peu confus. Si ordinateur.config code> est lié à un objet, ce qui en fait une méthode d'instance, alors quel est com1.config () code> 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 B> une méthode d'instance qui nécessite un objet. Seuls staticmethod code> et ClassMethod code> 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 () code> ou ordinateur.config (COM1) code> 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
parce que Avez-vous remarqué le ordinateur code> 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 code>. COM1 code> est une instance créée par ordinateur code>. Vous pouvez utiliser com1 code> pour appeler ses fonctions non statiques, mais vous ne pouvez pas utiliser l'ordinateur code> de la méta-classe > pour invoquer des fonctions non statiques, qui nécessitent un objet à courir. sur. p>
Pourquoi la troisième approche fonctionne-t-elle? h2>
auto code> dans la définition de la fonction config code>? Cela signifie que lorsque vous invoquez com1.config () code> ce que vous faites réellement est d'appeler config code> avec COM1 code> comme argument. Donc com1.config () code> est identique à celui ordinateur.config (COM1) code>. P>
ordinateur code> est une classe B>, pas une métaclasse. Une métaclasse est autre chose.
@khelwood ordinateur code>, 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 code> 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 i> ordinateur".
Ceci est parce que et comme vous l'avez dit: P> Si vous modifiez le code directement ci-dessus pour inclure l'instance en tant que
argument lors de l'appelant la méthode, comme: P>
blockQuote> Ceci est parce que chaque fonction d'instance prend Cela signifie que lorsque vous invoquez config () code> 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 () code> en utilisant simplement le nom de la classe, vous devez dire au compilateur qu'il est statique. Pour faire cette utilisation @staticmeThod code> étiquette et supprimez l'argument auto code>:
auto code> car il s'agit d'un premier argument. Fondamentalement auto code> est un peu similaire à Ceci code> en C ++ ou Java, et indique quel objet fonctionner sur, c'est-à-dire, auto code> agit comme un pointeur à l'objet actuel. Lorsque vous avez passé l'objet code> COM1 code> à l'argument, il s'est fallu pour COM1 code>. P> com1.config ( ) code> Ce que vous faites réellement est d'appeler config code> avec COM1 code> comme argument. Donc com1.config (((() code> est identique à celui ordinateur.config (COM1) code>. P> p>
En réalité
instance.method () code> fait un appel àclasse.method (instance) code> en arrière-plan. (Ce comportement pourrait être modifié par des décorateurs.)COM1 code> est une instance de la classeordinateur code>. Ils ne sont pas interchangeables.Cette question a déjà des réponses ici: TypeError: Un argument de position requis