¿Cuál es el propósito de la selfpalabra 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).

@namemás intuitivo queself.name? El último, IMO, es más intuitivo.@fooyself.fooson 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 (aunqueselfes la convención, y la gente generalmente fruncirá el ceño cuando usa otra cosa)selfno 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
clsrefiere al objeto de clase, no al objeto de instanciaclsyselfse usa convencionalmente, por ejemplo, métodos. Si quisiera, podría usarloselfpara métodos de clase y,clspor ejemplo, métodos. También podría usarbobyfnordsi quisiera.thislugar deself. ¿selfTiene algún historial del que no tenga conocimiento en lenguajes de programación antiguos?selfvino de las convenciones de Modula-3, vea esta respuesta para obtener más detalles sobre esta elección. (Descargo de responsabilidad: es mío).selfpalabra clave (Smalltalk, 1980) es anterior a lathispalabra 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
lengthmétodo para nuestraVectorclase, podríamos hacer esto:Esto funciona porque el primer parámetro de
length_global, se puede reutilizar comoselfparámetro enlength_new. Esto no sería posible sin un explícitoself.Otra forma de entender la necesidad de lo explícito
selfes 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
selfencaja. 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_globalmuestra.Digamos que tiene una clase
ClassAque contiene un métodomethodAdefinido como:y
ObjectAes una instancia de esta clase.Ahora cuando
ObjectA.methodA(arg1, arg2)se llama, python lo convierte internamente para usted como:La
selfvariable 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
selfdel 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.fooen el primer ejemplo, en lugar de hacerloA.foo? Claramentefoopertenece a la clase ...aybson ambas etiquetas (o punteros) paraA()(la clase).a.foohace referencia alA().foométodo de clase. Sin embargo,aen 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 elfoomé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
thispalabras 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 getAnimalNamepara no golpear la cadena que está intentando devolver, y seselfrefiere 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_namehay 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
selfes 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í.selfen Python se puede usar para tratar con modelos de objetos personalizados o algo así.fuente
El uso del argumento, convencionalmente llamado,
selfno 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
selfargumento 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
@staticmethoddecorador, de lo contrario, elselfargumento 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
selfselfse 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
fubarfunción no funcionaría, ya que supondría queselfes una variable global (yfrobtambién en). La alternativa sería ejecutar métodos con un alcance global reemplazado (dondeselfestá el objeto).El enfoque implícito sería
Esto significaría que
myXse interpretaría como una variable local enfubar(yfrobtambié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 delselfparámetro, yfubaraún se puede llamar con un objeto como parámetro y funciona igual ( es lo mismoC.frobque 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)dondevarse usó en el__init__(var,[...])También deberías echar un vistazo
clspara 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
selfes inevitable.Solo había una pregunta que debía
selfser implícita o explícita.Guido van Rossumresolvió esta pregunta diciendo queselftiene que quedarse .Entonces, ¿dónde
selfviven?Si nos limitáramos a la programación funcional, no la necesitaríamos
self. Una vez que ingresamos a Python OOP encontramosselfallí.Aquí está el caso de uso típico
class Ccon el métodom1Este programa generará:
Entonces
selfcontiene la dirección de memoria de la instancia de clase. El propósito deselfserí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