En este código:
class A(object):
def __init__(self):
self.x = 'Hello'
def method_a(self, foo):
print self.x + ' ' + foo
... la self
variable 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 A
clase 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.x
oa.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.x
se imprimirábar
entoncesfoo
self
, solo es por convención.object
la declaración de clase? He notado que algunas clases tienen esto y otras noobject
porque sucede de manera predeterminada.Sí, tienes razón, estas son construcciones oop.
__init__
es el constructor de una clase. Elself
parámetro se refiere a la instancia del objeto (comothis
en C ++).los
__init__
llama al método cuando se asigna memoria para el objeto:Es importante usar el
self
pará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
x
yy
se almacenarán en variables en la pila y se descartarán cuando el método init salga del alcance. Establecer esas variables comoself._x
yself._y
establece esas variables como miembros delPoint
objeto (accesible durante la vida útil del objeto).fuente
self
estar 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:
self
como 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.a
se referirá a una instancia separada de la variable para cada uno de los N objetos. Imagina N copias de la variablea
para 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:
Jay
Sum = 5
Doc - Inside Class
Doc - __init__ Constructor
Doc - Inside Show
Destructor Deleting object - Jay
fuente
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.i
yMyClass.f
son 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.i
por 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
self
realidad 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.self
representa 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.self
representa 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, seself
refiere 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
self
argumento 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 errorinit
es 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 llamamosSomeObject
a'blah'
continuación (que podría ser cualquier cosa), se pasa a la__init__
función como argumentoblah
:El
self
argumento es la instancia deSomeObject
que 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.method
vincula 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
self
argumento implícitamente pasado se llamaself
por 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