def __init__ python class object self

__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