__init__ - self python
Python-yo, no yo y cls (2)
Otra pregunta sobre para qué sirve el "yo", qué pasa si no usas "yo" y para qué es "cls". "Hice mi tarea", solo quiero asegurarme de que lo tengo todo.
self
: para acceder a un atributo de un objeto, debe prefijar el nombre del atributo con el nombre del objeto ( objname.attributename
). De la misma manera, el self
se usa para acceder a un atributo dentro del objeto (clase). Entonces, si no prefijaste una variable con self en un método de clase, no podrías acceder a esa variable en otros métodos de la clase, o fuera de la clase. Por lo tanto, podría omitirlo si quisiera que la variable sea local para ese método únicamente. De la misma manera, si tuvieras un método y no tuvieras ninguna variable que quisieras compartir con otros métodos, podrías omitir el self
de los argumentos del método.
cls
: cada instancia crea su propia "copia" de los atributos, por lo que si desea que todas las instancias de una clase compartan la misma variable, debe prefijar ese nombre de variable con '' cls
'' en la declaración de clase.
¿Está todo bien? Gracias.
De la misma manera, el yo se usa para acceder a un atributo dentro del objeto (clase).
No dentro del objeto / clase, solo dentro de los métodos de instancia de la clase. self
es solo una convención, puedes llamarlo como quieras, incluso algo diferente en cada método.
Entonces, si no prefijaste una variable con self en un método de clase, no podrías acceder a esa variable en otros métodos de la clase, o fuera de la clase.
self
se usa en los métodos de instancia , cls
se usa a menudo en los métodos de clase . De lo contrario, correcto.
Por lo tanto, podría omitirlo si quisiera que la variable sea local para ese método únicamente.
Sí, dentro de un método, un nombre de variable es como dentro de cualquier otra función: el intérprete busca el nombre localmente, luego en cierres, luego en el nivel global / módulo, luego en los integrables de Python.
De la misma manera, si tuvieras un método y no tuvieras ninguna variable que quisieras compartir con otros métodos, podrías omitir el self de los argumentos del método.
No, no puedes omitir "self" de los argumentos del método. Tienes que decirle a Python que quieres un staticmethod
, que no pasará automáticamente la instancia de la clase, éter, haciendo @staticmethod
encima de la línea def
, o mymethod = staticmethod(mymethod)
debajo del cuerpo del método.
Cada instancia crea su propia "copia" de los atributos, por lo tanto, si desea que todas las instancias de una clase compartan la misma variable, debe prefijar ese nombre de variable con ''cls'' en la declaración de la clase.
Dentro de la definición de la clase , pero fuera de cualquier método, los nombres están vinculados a la clase; así es como defines los métodos, etc. No los pones en prefijo con cls
o cualquier otra cosa.
cls
se usa generalmente en el __new__
staticmethod
__new__
especial, o en classmethod
s, que se hace de forma similar a los staticmethod
. Estos son métodos que solo necesitan acceso a la clase, pero no a cosas específicas de cada instancia de la clase.
Dentro de un classmethod
, sí, classmethod
esto para referirte a los atributos que querías que todas las instancias de la clase y la clase compartan.
Al igual que self
, cls
es solo una convención, y puedes llamarlo como quieras.
Un breve ejemplo:
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
Usas self
como el primer argumento en métodos regulares donde la instancia se pasa automáticamente a través de este argumento. Entonces, cualquiera que sea el primer argumento en un método, apunta a la instancia actual
Cuando un método está decorado con @classmethod
, pasa la clase como su primer argumento, por lo que el nombre más común es cls
ya que apunta a la clase .
Por lo general, no prefijas ninguna variable (la notación húngara es mala).
Aquí hay un ejemplo:
class Test(object):
def hello(self):
print ''instance %r says hello'' % self
@classmethod
def greet(cls):
print ''class %r greet you'' % cls
Salida:
>>> Test().hello()
instance <__main__.Test object at 0x1f19650> says hello
>>> Test.greet()
class <class ''__main__.Test''> greet you