2010-11-09 15 views
7

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?

+2

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) –

+0

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 –

+3

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

Respuesta

4

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.

+3

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. –

0

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.

+0

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

+1

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

+0

@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__'. –

3

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 
Cuestiones relacionadas