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.
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 classmethod
s, que vous créez de la même manière que staticmethod
s. 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
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