web-dev-qa-db-fra.com

Python - self, no self et cls

Encore une autre question sur ce à quoi sert le "soi", que se passe-t-il si vous n'utilisez pas le "soi" et à quoi servent les "cls". J'ai "fait mes devoirs", je veux juste m'assurer d'avoir tout compris.

self - Pour accéder à un attribut d'un objet, vous devez préfixer le nom de l'attribut avec le nom de l'objet (objname.attributename). De la même manière, self est utilisé pour accéder à un attribut à l'intérieur l'objet (classe) lui-même. Donc, si vous ne préfixez pas une variable avec self dans une méthode de classe, vous ne pourrez pas accéder à cette variable dans d'autres méthodes de la classe, ou en dehors de la classe. Vous pouvez donc l'omettre si vous souhaitez rendre la variable locale à cette méthode uniquement. De la même manière, si vous aviez une méthode et que vous n'aviez aucune variable que vous vouliez partager avec d'autres méthodes, vous pourriez omettre le self des arguments de la méthode.

cls - Chaque instance crée sa propre "copie" des attributs, donc si vous vouliez que toutes les instances d'une classe partagent la même variable, vous préfixeriez ce nom de variable avec 'cls' dans la déclaration de classe.

Est-ce que ça va? Merci.

51
Joelmc

De la même manière, self est utilisé pour accéder à un attribut à l'intérieur de l'objet (classe) lui-même.

Pas à l'intérieur de l'objet/classe, juste à l'intérieur de la classe 'méthodes d'instance. self n'est qu'une convention, vous pouvez l'appeler comme vous le souhaitez, même quelque chose de différent dans chaque méthode.

Donc, si vous ne préfixez pas une variable avec self dans une méthode de classe, vous ne pourrez pas accéder à cette variable dans d'autres méthodes de la classe, ou en dehors de la classe.

self est utilisé dans méthodes d'instance, cls est souvent utilisé dans méthodes de classe. Sinon, c'est correct.

Vous pouvez donc l'omettre si vous souhaitez rendre la variable locale à cette méthode uniquement.

Oui, à l'intérieur d'une méthode, un nom de variable est comme à l'intérieur de toute autre fonction - l'interpréteur recherche le nom localement, puis dans les fermetures, puis au niveau globals/module, puis dans le Python construit -en.

De la même manière, si vous aviez une méthode et que vous n'aviez aucune variable que vous vouliez partager avec d'autres méthodes, vous pourriez omettre le self des arguments de méthode.

Non, vous ne pouvez pas simplement omettre "self" des arguments de la méthode. Vous devez dire Python vous voulez un staticmethod, qui ne passera pas automatiquement l'instance de la classe, ether en faisant @staticmethod Au-dessus du def line, ou mymethod = staticmethod(mymethod) sous le corps de la méthode.

Chaque instance crée sa propre "copie" des attributs, donc si vous voulez que toutes les instances d'une classe partagent la même variable, vous préfixez ce nom de variable avec "cls" dans la déclaration de classe.

À l'intérieur de la définition de classe, mais en dehors de toute méthode, les noms sont liés à la classe - c'est ainsi que vous définissez les méthodes, etc. Vous ne les préfixez pas avec cls ou autre chose.

cls est généralement utilisé dans le __new__ spécial staticmethod, ou dans classmethods, que vous créez de la même manière que staticmethods. Ce sont des méthodes qui n'ont besoin que d'accéder à la classe, mais pas aux choses spécifiques à chaque instance de la classe.

Dans un classmethod, oui, vous utiliseriez ceci pour faire référence aux attributs que vous souhaitez que toutes les instances de la classe, et la classe elle-même, partagent.

Comme self, cls n'est qu'une convention, et vous pouvez l'appeler comme vous le souhaitez.

Un bref exemple:

class Foo(object):

    # you couldn't use self. or cls. out here, they wouldn't mean anything

    # this is a class attribute
    thing = 'athing'

    def __init__(self, bar):
        # I want other methods called on this instance of Foo
        # to have access to bar, so I create an attribute of self
        # pointing to it
        self.bar = bar

    @staticmethod
    def default_foo():
        # static methods are often used as alternate constructors,
        # since they don't need access to any part of the class
        # if the method doesn't have anything at all to do with the class
        # just use a module level function
        return Foo('baz')

    @classmethod
    def two_things(cls):
        # can access class attributes, like thing
        # but not instance attributes, like bar
        print cls.thing, cls.thing
86
agf

Vous utilisez self comme premier argument dans les méthodes normales où l'instance est transmise automatiquement via cet argument. Donc, quel que soit le premier argument dans une méthode - il pointe vers le courant instance

Lorsqu'une méthode est décorée de @classmethod il obtient la classe comme premier argument, donc le nom le plus courant est cls car il pointe vers class.

Vous n'avez généralement pas de préfixe aucune variable (la notation hongroise est mauvaise).


Voici un exemple:

class Test(object):
    def hello(self):
        print 'instance %r says hello' % self
    @classmethod
    def greet(cls):
        print 'class %r greet you' % cls

Sortie:

>>> Test().hello()
instance <__main__.Test object at 0x1f19650> says hello

>>> Test.greet()
class <class '__main__.Test'> greet you
10
ThiefMaster