En este código:
class A(object):
def __init__(self):
self.x = 'Hello'
def method_a(self, foo):
print self.x + ' ' + foo
... la selfvariable representa la instancia del objeto en sí. La mayoría de los lenguajes orientados a objetos pasan esto como un parámetro oculto a los métodos definidos en un objeto; Python no lo hace. Tienes que declararlo explícitamente. Cuando crea una instancia de la Aclase y llama a sus métodos, se pasará automáticamente, como en ...
a = A() # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument
El __init__método es aproximadamente lo que representa un constructor en Python. Cuando llama a A()Python, crea un objeto para usted y lo pasa como el primer parámetro al __init__método. Cualquier parámetro adicional (p. Ej. A(24, 'Hello')) También se pasará como argumento, en este caso , se generará una excepción, ya que el constructor no los espera.
x = 'Hello'fuera de init pero dentro de la clase? ¿Es como Java donde es lo mismo, o se convierte en una variable estática que solo se inicializa una vez?A.xoa.x. Tenga en cuenta que anularlo en una clase específica no afectará la base, por lo queA.x = 'foo'; a.x = 'bar'; print a.x; print A.xse imprimirábarentoncesfooself, solo es por convención.objectla declaración de clase? He notado que algunas clases tienen esto y otras noobjectporque sucede de manera predeterminada.Sí, tienes razón, estas son construcciones oop.
__init__es el constructor de una clase. Elselfparámetro se refiere a la instancia del objeto (comothisen C ++).los
__init__llama al método cuando se asigna memoria para el objeto:Es importante usar el
selfparámetro dentro del método de un objeto si desea conservar el valor con el objeto. Si, por ejemplo, implementa el__init__método de esta manera:Sus parámetros
xyyse almacenarán en variables en la pila y se descartarán cuando el método init salga del alcance. Establecer esas variables comoself._xyself._yestablece esas variables como miembros delPointobjeto (accesible durante la vida útil del objeto).fuente
selfestar en el constructor? ¿Por qué incluso tiene que especificarlo, no sería mejor si fuera implícito?Un breve ejemplo ilustrativo.
Con la esperanza de que pueda ayudar un poco, aquí hay un ejemplo simple que utilicé para entender la diferencia entre una variable declarada dentro de una clase y una variable declarada dentro de una
__init__función:Salida:
fuente
__init__es lo que se pasa a las instancias de la clase, no la variable 'estática' de la clase en sí que tiene el mismo nombre ...En breve:
selfcomo sugiere, se refiere a sí mismo , el objeto que ha llamado el método. Es decir, si tiene N objetos que llaman al método,self.ase referirá a una instancia separada de la variable para cada uno de los N objetos. Imagina N copias de la variableapara cada objeto__init__es lo que se llama como constructor en otros lenguajes OOP como C ++ / Java. La idea básica es que es un método especial que se llama automáticamente cuando se crea un objeto de esa clasefuente
__init__actúa como un constructor Deberá pasar "self" a cualquier función de clase como primer argumento si desea que se comporten como métodos no estáticos. "self" son variables de instancia para su clase.fuente
Prueba este código. Espero que ayude a muchos programadores de C como yo a aprender Py.
Salida:
JaySum = 5Doc - Inside ClassDoc - __init__ ConstructorDoc - Inside ShowDestructor Deleting object - Jayfuente
Los objetos de clase admiten dos tipos de operaciones: referencias de atributos e instanciación
Las referencias de atributos utilizan la sintaxis estándar utilizada para todas las referencias de atributos en Python: obj.name. Los nombres de atributo válidos son todos los nombres que estaban en el espacio de nombres de la clase cuando se creó el objeto de clase. Entonces, si la definición de clase se ve así:
entonces
MyClass.iyMyClass.fson referencias de atributo válidas, que devuelven un entero y un objeto de función, respectivamente. Los atributos de clase también se pueden asignar a, por lo que puede cambiar el valor deMyClass.ipor asignación.__doc__también es un atributo válido, que devuelve la cadena de documentación perteneciente a la clase: "Una clase de ejemplo simple".La instanciación de clase utiliza la notación de función. Simplemente imagine que el objeto de clase es una función sin parámetros que devuelve una nueva instancia de la clase. Por ejemplo:
La operación de instanciación ("llamar" a un objeto de clase) crea un objeto vacío. A muchas clases les gusta crear objetos con instancias personalizadas para un estado inicial específico. Por lo tanto, una clase puede definir un método especial llamado
__init__(), como este:Cuando una clase define un
__init__()método, la instanciación de clase se invoca automáticamente__init__()para la instancia de clase recién creada. Entonces, en este ejemplo, se puede obtener una nueva instancia inicializada:Por supuesto, el
__init__()método puede tener argumentos para una mayor flexibilidad. En ese caso, los argumentos dados al operador de instanciación de clase se pasan a__init__(). Por ejemplo,Tomado de la documentación oficial que más me ayudó al final.
Aqui esta mi ejemplo
Cuando crea una instancia de clase Bill:
Usted obtiene:
fuente
Tuve problemas para entender esto yo mismo. Incluso después de leer las respuestas aquí.
Para comprender correctamente el
__init__método, necesita comprenderse a sí mismo.El autoparámetro
Los argumentos aceptados por el
__init__método son:Pero en realidad solo le pasamos dos argumentos:
¿De dónde viene el argumento extra?
Cuando accedemos a los atributos de un objeto, lo hacemos por nombre (o por referencia). Aquí la instancia es una referencia a nuestro nuevo objeto. Accedemos al método printargs del objeto de instancia usando instance.printargs.
Para acceder a los atributos del objeto desde el
__init__método, necesitamos una referencia al objeto.Cada vez que se llama a un método, se pasa una referencia al objeto principal como primer argumento. Por convención, siempre llamas a este primer argumento tus métodos.
Esto significa en el
__init__método que podemos hacer:Aquí estamos estableciendo atributos en el objeto. Puede verificar esto haciendo lo siguiente:
valores como este se conocen como atributos de objeto. Aquí el
__init__método establece los atributos arg1 y arg2 de la instancia.fuente: http://www.voidspace.org.uk/python/articles/OOP.shtml#the-init-method
fuente
tenga en cuenta que en
selfrealidad podría ser cualquier identificador válido de Python. Por ejemplo, podríamos escribir con la misma facilidad, a partir del ejemplo de Chris B:y funcionaría exactamente igual. Sin embargo, se recomienda usar self porque otros pythoners lo reconocerán más fácilmente.
fuente
Básicamente, debe usar la palabra clave 'self' cuando usa una variable en múltiples funciones dentro de la misma clase. En cuanto a init , se usa para configurar valores predeterminados en caso de que no se invoquen otras funciones dentro de esa clase.
fuente
__init__es básicamente una función que "inicializará" / "activará" las propiedades de la clase para un objeto específico, una vez creado y emparejado con la clase correspondiente.selfrepresenta ese objeto que heredará esas propiedades.fuente
El 'self' es una referencia a la instancia de clase
Ahora podemos crear una instancia de foo y llamar al método en él, Python agrega el parámetro self en este caso:
Pero también se puede pasar si la llamada al método no está en el contexto de una instancia de la clase, el siguiente código hace lo mismo
Curiosamente, el nombre variable 'self' es solo una convención. La siguiente definición funcionará exactamente igual. Habiendo dicho que es una convención muy fuerte que debe seguirse siempre , pero sí dice algo sobre la naturaleza flexible del lenguaje.
fuente
s) estaba mostrando la flexibilidad de python.Solo una demostración de la pregunta.
fuente
En este código:
Aquí
__init__actúa como un constructor de la clase y cuando se crea una instancia de un objeto, se llama a esta función.selfrepresenta el objeto de instanciación.El resultado de las declaraciones anteriores será el siguiente:
fuente
El primer argumento de cada método de clase, incluido init, siempre es una referencia a la instancia actual de la clase . Por convención, este argumento siempre se nombra
self. En el método init, seselfrefiere al objeto recién creado; en otros métodos de clase, se refiere a la instancia cuyo método fue llamado.Python no te obliga a usar " self ". Puedes darle el nombre que quieras. Pero recuerde que el primer argumento en la definición de un método es una referencia al objeto . Python agrega el
selfargumento a la lista por usted; no necesita incluirlo cuando llame a los métodos. si no proporcionó el método self en init, obtendrá un errorinites la abreviatura de inicialización. Es un constructor que se llama cuando realiza una instancia de la clase y no es necesario . Pero por lo general, nuestra práctica es escribir un método init para establecer el estado predeterminado del objeto. Si no está dispuesto a establecer ningún estado del objeto inicialmente, entonces no necesita escribir este método.fuente
fuente
El ejemplo dado no es correcto, así que permítame crear un ejemplo correcto basado en él:
Cuando creamos una instancia del objeto,
__init__se llama para personalizar el objeto después de que se haya creado. Es decir, cuando llamamosSomeObjecta'blah'continuación (que podría ser cualquier cosa), se pasa a la__init__función como argumentoblah:El
selfargumento es la instancia deSomeObjectque se asignará aan_object.Más tarde, podríamos querer llamar a un método en este objeto:
Haciendo la búsqueda punteada, es decir,
an_object.methodvincula la instancia a una instancia de la función, y el método (como se llamó anteriormente) ahora es un método "vinculado", lo que significa que no necesitamos pasar explícitamente la instancia a la llamada al método .La llamada al método obtiene la instancia porque estaba vinculada en la búsqueda punteada y, cuando se llama, ejecuta el código que estaba programado para realizar.
El
selfargumento implícitamente pasado se llamaselfpor convención. Podríamos usar cualquier otro nombre legal de Python, pero es probable que otros programadores de Python lo asfixien y lo arruinen si lo cambia por otra cosa.__init__es un método especial, documentado en la documentación del modelo de datos de Python . Se llama inmediatamente después de que se crea la instancia (generalmente a través de__new__, aunque__new__no es necesario a menos que esté subclasificando un tipo de datos inmutable).fuente
Aquí, el chico ha escrito bastante bien y simple: https://www.jeffknupp.com/blog/2014/06/18/improve-your-python-python-classes-and-object-oriented-programming/
Lea el enlace de arriba como referencia a esto:
fuente