Por lo que sé, self es simplemente una convención muy poderosa y no es realmente una palabra clave reservada en Python. Java y C# tienen este como palabra clave. Realmente me parece extraño que no hayan creado una palabra reservada para ello en Python. ¿Hay alguna razón detrás de esto?¿Por qué el yo solo es una convención y no una verdadera palabra clave de Python?
Respuesta
Guido van Rossum ha blogueado sobre por qué la auto explícita tiene que quedarse: http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html
Creo que después ayuda a comprender mejor las decisiones de diseño detrás de auto expreso.
Eso no es lo que se preguntó. La pregunta no es "¿por qué necesito tipear uno mismo?", Sino "¿por qué el yo es solo una convención y no una palabra clave?". Es posible tener 'def foo (esto):' si realmente quieres, creo que está preguntando por qué no se te obliga a llamarlo a ti mismo. –
Porque un método es solo una función cuyo primer parámetro se usa para pasar el objeto. Puede escribir un método como este:
class Foo(object):
pass
def setx(self, x):
self.x = x
Foo.setx = setx
foo = Foo()
foo.setx(42)
print foo.x # Prints 42.
Cualquiera que sea el mérito o no de esta filosofía, que da lugar a una noción más unificada de las funciones y métodos.
Un método no es exactamente solo "una función": como muestra su ejemplo, un método puede vincularse a una instancia de objeto, en cuyo caso se comporta como una función. Aquí, 'foo.setx' es un método * bound *, que funciona como una función, pero' Foo.setx' es un * método *, que no funciona como una función. Por ejemplo, no puede hacer 'Foo.setx (instance_from_another_class, 42)'. – EOL
EOL: Cuando escribimos un nombre, es una función, y eso es lo que determina la respuesta a esta pregunta. No tendría sentido convertir "self" en una palabra clave, ya que para Python ser python, los usuarios aún deberían poder usar cualquier otro nombre de variable como el primer parámetro en un método. En cuanto a sus inquietudes, cuando hacemos uso de métodos en un programa, en realidad no son funciones: se convierten a objetos de método en el momento de recuperación de los atributos: http://metapython.blogspot.com/2010/11/python-instance- methods-how-are-they.html – jsbueno
@EOL: Supongo que es una cuestión de perspectiva. Pruebe esto: 'id (Foo.setx.func_code) == id (setx.func_code)'. Si bien las reglas sobre cómo se puede llamar pueden diferir entre 'setx' y' Foo.setx', ambas se implementan exactamente como la misma función. Los únicos atributos que difieren son '__class__' y' __new__'. –
Porque self
es solo un parámetro de una función, como cualquier otro parámetro. Por ejemplo, la siguiente llamada:
a = A() a.x()
esencialmente se convierte en:
a = A() A.x(a)
No hacer self
una palabra reservada que ha tenido el resultado afortunados, así que para los métodos de la clase, se puede cambiar el nombre del primer parámetro a otra cosa (normalmente cls
). Y por supuesto para los métodos estáticos, el primer parámetro no tiene relación con la instancia se le llama en, por ejemplo:
class A: def method(self): pass @classmethod def class_method(cls): pass @staticmethod def static_method(): pass class B(A): pass b = B() b.method() # self is b b.class_method() # cls is B b.static_method() # no parameter passed
- 1. ¿Por qué la salida Boolean.ToString es "Verdadera" y no "verdadera"
- 2. ¿Por qué LINQ no incluye una palabra clave `distinct`?
- 3. ¿Qué efecto tiene la palabra clave "nueva" en C# y por qué es solo una advertencia cuando no está empleado?
- 4. ¿Por qué la palabra clave params no es contextual?
- 5. ¿Por qué no hay palabra clave "no es" en C#?
- 6. ¿Por qué palabra clave "paquete" y .h?
- 7. ¿Por qué la impresión no es una función en python?
- 8. ¿Qué es "codificación por convención"?
- 9. Macro de esquema activada por palabra clave que no es el encabezado de una lista
- 10. Palabra clave auto de C++. ¿Por qué es magia?
- 11. ¿Qué es una verdadera matriz multidimensional?
- 12. Python: SyntaxError: la palabra clave no puede ser una expresión
- 13. ¿Por qué esta consulta de prólogo es verdadera y falsa?
- 14. Javascript paquete, es una palabra clave reservada
- 15. palabra clave C++ extern en las funciones. ¿Por qué no solo incluir el archivo de encabezado?
- 16. En C++, ¿por qué esta palabra clave no es una referencia?
- 17. eventos de la convención - Yo no lo entiendo
- 18. ¿Por qué existe la palabra clave async
- 19. ¿por qué esta condición es verdadera?
- 20. Operador condicional con solo una declaración verdadera
- 21. Palabra clave dinámica C# 4: ¿por qué no?
- 22. ¿Es el nombre una palabra clave especial en PostgreSQL?
- 23. Requirejs - Cargando módulos solo si una condición es verdadera
- 24. ¿Es nula una palabra clave Java?
- 25. F # - ¿Qué es la palabra clave "eso"?
- 26. ¿Por qué se usa una palabra clave "fuerte" en una propiedad en un entorno que no es de ARC?
- 27. ¿Es posible tener una gramática en la que una "palabra clave" también se pueda tratar como "no palabra clave"?
- 28. ¿Qué es el "yo" en Akka?
- 29. palabra clave no es compatible error 'proveedor'
- 30. Definir el contexto de una palabra - Python
posible duplicado de [? ¿Por qué necesita tener explícitamente el argumento de "auto" en un método de Python] (http://stackoverflow.com/questions/68282/why-do-you-need-explicitly-have-the-self-argument-into-a-python-method) –
self no es una palabra clave porque en Python el self es explícito , a diferencia de C#. Entonces, esta es realmente la misma pregunta que la que he vinculado en el comentario anterior. Por favor, léelo y otros enlaces desde él, para obtener información completa –
La pregunta es claramente diferente. Preguntar por qué uno mismo es una palabra clave merece una respuesta diferente y más simple de por qué un yo explícito. – jsbueno