¿Cuál es el propósito de la self
palabra en Python? Entiendo que se refiere al objeto específico creado a partir de esa clase, pero no puedo ver por qué debe agregarse explícitamente a cada función como parámetro. Para ilustrar, en Ruby puedo hacer esto:
class myClass
def myFunc(name)
@name = name
end
end
Lo cual entiendo, con bastante facilidad. Sin embargo, en Python necesito incluir self
:
class myClass:
def myFunc(self, name):
self.name = name
¿Alguien puede hablarme sobre esto? No es algo con lo que me haya encontrado en mi experiencia (ciertamente limitada).
@name
más intuitivo queself.name
? El último, IMO, es más intuitivo.@foo
yself.foo
son igualmente explícitos ya que no es necesario que se produzca una resolución implícita (por ejemplo, en C ++, se puede acceder "implícitamente" a los miembros de la instancia sin "explícitamente" usar espacios de nombres). La única diferencia es que Ruby introduce una nueva semántica (@), mientras que Python no. Si una nueva semántica valió o no la cantidad de verbosidad evitada es puramente subjetiva. Sin embargo, debe tenerse en cuenta que la mayoría de los lenguajes modernos eligen introducir un concepto aquí (por ejemplo, php's $ this, JS's this).Respuestas:
La razón que necesita usar
self.
es porque Python no usa la@
sintaxis para referirse a los atributos de instancia. Python decidió hacer métodos de una manera que haga que la instancia a la que pertenece el método se pase automáticamente, pero no se reciba automáticamente: el primer parámetro de los métodos es la instancia en la que se llama al método. Eso hace que los métodos sean completamente iguales a las funciones, y deja que el nombre real lo use usted (aunqueself
es la convención, y la gente generalmente fruncirá el ceño cuando usa otra cosa)self
no es especial para el código, es solo otro objeto .Python podría haber hecho algo más para distinguir los nombres normales de los atributos, una sintaxis especial como la que Ruby tiene, o requerir declaraciones como C ++ y Java, o tal vez algo aún más diferente, pero no fue así. Python es todo para hacer las cosas explícitas, haciendo obvio qué es qué, y aunque no lo hace completamente en todas partes, sí lo hace, por ejemplo, los atributos. Es por eso que asignar a un atributo de instancia necesita saber a qué instancia asignar, y es por eso que necesita
self.
.fuente
cls
refiere al objeto de clase, no al objeto de instanciacls
yself
se usa convencionalmente, por ejemplo, métodos. Si quisiera, podría usarloself
para métodos de clase y,cls
por ejemplo, métodos. También podría usarbob
yfnord
si quisiera.this
lugar deself
. ¿self
Tiene algún historial del que no tenga conocimiento en lenguajes de programación antiguos?self
vino de las convenciones de Modula-3, vea esta respuesta para obtener más detalles sobre esta elección. (Descargo de responsabilidad: es mío).self
palabra clave (Smalltalk, 1980) es anterior a lathis
palabra clave (de C ++). Ver: stackoverflow.com/questions/1079983/…Tomemos una clase de vector simple:
Queremos tener un método que calcule la longitud. ¿Cómo sería si quisiéramos definirlo dentro de la clase?
¿Cómo debería ser cuando lo definiéramos como un método / función global?
Entonces toda la estructura permanece igual. ¿Cómo puedo hacer uso de esto? Si suponemos por un momento que no habíamos escrito un
length
método para nuestraVector
clase, podríamos hacer esto:Esto funciona porque el primer parámetro de
length_global
, se puede reutilizar comoself
parámetro enlength_new
. Esto no sería posible sin un explícitoself
.Otra forma de entender la necesidad de lo explícito
self
es ver dónde Python agrega algo de azúcar sintáctico. Cuando recuerdas, básicamente, una llamada comose transforma internamente en
es fácil ver dónde
self
encaja. En realidad, no escribe métodos de instancia en Python; lo que escribes son métodos de clase que deben tomar una instancia como primer parámetro. Y por lo tanto, tendrá que colocar el parámetro de instancia en algún lugar explícitamente.fuente
Vector.length_new = length_global
muestra.Digamos que tiene una clase
ClassA
que contiene un métodomethodA
definido como:y
ObjectA
es una instancia de esta clase.Ahora cuando
ObjectA.methodA(arg1, arg2)
se llama, python lo convierte internamente para usted como:La
self
variable se refiere al objeto mismo.fuente
Cuando se crean instancias de objetos, el objeto mismo se pasa al parámetro self.
Debido a esto, los datos del objeto están vinculados al objeto. A continuación se muestra un ejemplo de cómo le gustaría visualizar el aspecto de los datos de cada objeto. Observe cómo 'self' se reemplaza con el nombre de los objetos. No digo que este diagrama de ejemplo a continuación sea del todo exacto, pero espero que sirva para visualizar el uso de uno mismo.
El objeto se pasa al parámetro self para que el objeto pueda mantener sus propios datos.
Aunque esto puede no ser del todo exacto, piense en el proceso de crear instancias de un objeto como este: cuando se crea un objeto, utiliza la clase como plantilla para sus propios datos y métodos. Sin pasar su propio nombre al parámetro self, los atributos y métodos de la clase permanecerían como una plantilla general y no se referenciaría (pertenecería) al objeto. Entonces, al pasar el nombre del objeto al parámetro auto, significa que si se instancian 100 objetos de una clase, todos pueden realizar un seguimiento de sus propios datos y métodos.
Vea la siguiente ilustración:
fuente
Me gusta este ejemplo:
fuente
self
del tipo de variable sino también de él. Intente hacer el primer ejemplo con un entero simple en lugar de una lista. El resultado sería bastante diferente.a.foo
en el primer ejemplo, en lugar de hacerloA.foo
? Claramentefoo
pertenece a la clase ...a
yb
son ambas etiquetas (o punteros) paraA()
(la clase).a.foo
hace referencia alA().foo
método de clase. Sin embargo,a
en el segundo ejemplo, se convierte en una referencia a una instancia deA()
, como lo haceb
. Ahora que son instancias en lugar del objeto de clase en sí, self permite que elfoo
método opere en las instancias.Lo demostraré con código que no usa clases :
Las clases son solo una forma de evitar pasar todo el tiempo en este "estado" (y otras cosas buenas como la inicialización, la composición de la clase, las metaclases raramente necesarias y el apoyo a métodos personalizados para anular operadores).
Ahora demostremos el código anterior utilizando la maquinaria de clase python incorporada, para mostrar cómo es básicamente lo mismo.
[migré mi respuesta de una pregunta cerrada duplicada]
fuente
Los siguientes extractos son de la documentación de Python sobre self :
Para obtener más información, consulte el tutorial de documentación de Python sobre clases .
fuente
Además de todas las otras razones ya mencionadas, permite un acceso más fácil a los métodos anulados; se le puede llamar
Class.some_method(inst)
.Un ejemplo de dónde es útil:
fuente
Su uso es similar al uso de
this
palabras clave en Java, es decir, para dar una referencia al objeto actual.fuente
Python no es un lenguaje creado para la programación orientada a objetos a diferencia de Java o C ++.
Al llamar a un método estático en Python, uno simplemente escribe un método con argumentos regulares dentro de él.
Sin embargo, un método de objeto, que requiere que hagas una variable, que es un animal, en este caso, necesita el argumento propio
El método self también se usa para referirse a un campo variable dentro de la clase.
En este caso, self se refiere a la variable animalName de toda la clase. RECUERDE: Si tiene una variable dentro de un método, self no funcionará. Esa variable simplemente existe mientras el método se está ejecutando. Para definir campos (las variables de toda la clase), debe definirlos FUERA de los métodos de clase.
Si no entiende una sola palabra de lo que estoy diciendo, entonces Google "Programación Orientada a Objetos". Una vez que comprenda esto, ni siquiera tendrá que hacer esa pregunta :).
fuente
staticMethod()
yobjectMethod(self)
. Me gustaría agregar eso para invocar el primero, diríaAnimal.staticMethod()
, mientrasobjectMethod()
necesita una instancia:a = Animal(); a.objectMethod()
def getAnimalName
para no golpear la cadena que está intentando devolver, y seself
refiere a la instancia de la clase, no a ningún campo dentro de ella.Está ahí para seguir el zen de Python "explícito es mejor que implícito". De hecho, es una referencia a su objeto de clase. En Java y PHP, por ejemplo, se llama
this
.Si
user_type_name
hay un campo en su modelo, puede acceder a élself.user_type_name
.fuente
En primer lugar, self es un nombre convencional, podría poner cualquier otra cosa (ser coherente) en su lugar.
Se refiere al objeto en sí mismo, por lo que cuando lo está utilizando, declara que .name y .age son propiedades de los objetos Student (nota, no de la clase Student) que va a crear.
El código está aquí
fuente
self
es una referencia de objeto al objeto en sí mismo, por lo tanto, son iguales. Los métodos de Python no se invocan en el contexto del objeto en sí.self
en Python se puede usar para tratar con modelos de objetos personalizados o algo así.fuente
El uso del argumento, convencionalmente llamado,
self
no es tan difícil de entender, como ¿por qué es necesario? ¿O por qué mencionarlo explícitamente? Esa, supongo, es una pregunta más grande para la mayoría de los usuarios que buscan esta pregunta, o si no es así, sin duda tendrán la misma pregunta a medida que avanzan aprendiendo Python. Les recomiendo que lean estos dos blogs:1: Uso de auto explicado
Tenga en cuenta que no es una palabra clave.
2: ¿Por qué lo tenemos de esta manera y por qué no podemos eliminarlo como un argumento, como Java, y tener una palabra clave en su lugar?
Otra cosa que me gustaría agregar es que un
self
argumento opcional me permite declarar métodos estáticos dentro de una clase, al no escribirself
.Ejemplos de código:
PD : esto solo funciona en Python 3.x.
En versiones anteriores, debe agregar explícitamente
@staticmethod
decorador, de lo contrario, elself
argumento es obligatorio.fuente
Me sorprende que nadie haya criado a Lua. Lua también usa la variable 'self', sin embargo, puede omitirse pero aún usarse. C ++ hace lo mismo con 'esto'. No veo ninguna razón para tener que declarar 'self' en cada función, pero aún así debería poder usarlo como puede hacerlo con lua y C ++. Para un lenguaje que se enorgullece de ser breve, es extraño que requiera que declares la auto variable.
fuente
Eche un vistazo al siguiente ejemplo, que explica claramente el propósito de
self
self
se usa / necesita para distinguir entre instancias.Fuente: auto variable en Python explicada - Pythontips
fuente
Es porque, por cierto, Python está diseñado, las alternativas difícilmente funcionarían. Python está diseñado para permitir que los métodos o funciones se definan en un contexto donde tanto implícito
this
(a-la Java / C ++) como explícito@
(a-la ruby) no funcionarían. Veamos un ejemplo con el enfoque explícito con las convenciones de python:Ahora la
fubar
función no funcionaría, ya que supondría queself
es una variable global (yfrob
también en). La alternativa sería ejecutar métodos con un alcance global reemplazado (dondeself
está el objeto).El enfoque implícito sería
Esto significaría que
myX
se interpretaría como una variable local enfubar
(yfrob
también en). La alternativa aquí sería ejecutar métodos con un alcance local reemplazado que se retiene entre llamadas, pero eso eliminaría la posibilidad de variables locales del método.Sin embargo, la situación actual funciona bien:
aquí, cuando se llama como método
frob
, recibirá el objeto en el que se llama a través delself
parámetro, yfubar
aún se puede llamar con un objeto como parámetro y funciona igual ( es lo mismoC.frob
que creo).fuente
En el
__init__
método, self se refiere al objeto recién creado; en otros métodos de clase, se refiere a la instancia cuyo método fue llamado.self, como nombre, es solo una convención , ¡llámalo como quieras! pero al usarlo, por ejemplo, para eliminar el objeto, debe usar el mismo nombre:,
__del__(var)
dondevar
se usó en el__init__(var,[...])
También deberías echar un vistazo
cls
para tener una imagen más grande . Esta publicación podría ser útil.fuente
self está actuando como el nombre del objeto actual o la instancia de clase.
fuente
self
es inevitable.Solo había una pregunta que debía
self
ser implícita o explícita.Guido van Rossum
resolvió esta pregunta diciendo queself
tiene que quedarse .Entonces, ¿dónde
self
viven?Si nos limitáramos a la programación funcional, no la necesitaríamos
self
. Una vez que ingresamos a Python OOP encontramosself
allí.Aquí está el caso de uso típico
class C
con el métodom1
Este programa generará:
Entonces
self
contiene la dirección de memoria de la instancia de clase. El propósito deself
sería mantener la referencia para métodos de instancia y para que tengamos acceso explícito a esa referencia.Tenga en cuenta que hay tres tipos diferentes de métodos de clase:
fuente
de los documentos ,
precediendo a esto el fragmento relacionado,
x = MyClass()
fuente
Es una referencia explícita al objeto de instancia de clase.
fuente