2010-07-19 18 views

Respuesta

0

En las clases se requiere una variable self (o cls para los métodos de la clase). Sin embargo, lo que quiere llamar es su decisión. Si lo prefiere, puede llamarlo this en su lugar.

A classmethod es un método que obtiene el class como primer argumento en lugar de una instancia. Se puede invocar sin pasar una instancia. es decir, con un classmethod que puede hacer:

SomeObject.some_class_method() 

mientras que un método normal requeriría que hagas

SomeObject().some_normal_method() 
or 
SomeObject.some_normal_method(instance) 
+0

cls es para 'métodos de clase', lo que significa que los métodos estáticos son correctos? – Blankman

+4

No, en Python [métodos estáticos] (http://docs.python.org/library/functions.html # staticmethod) son diferentes. –

+0

@Matthew Flaschen es correcto. Un método de clase recibe una referencia a la clase como su primer parámetro, un método estático no tiene parámetros requeridos. – danben

5

Sí, se utiliza de manera similar. Tenga en cuenta que es un parámetro posicional y puede llamarlo como desee; sin embargo, existe una fuerte convención para llamarlo self (no this o cualquier otra cosa). Algunos parámetros de posición deben estar ahí para un método de instancia utilizable; no es opcional

+0

"Debe estar allí" podría sugerirle a los no iniciados que _It_ es 'self'. Me gustaría aclarar que el primer parámetro debe estar allí y apuntará a una instancia del objeto. Se llama 'self' por convención, pero si escribes código para un concurso de codificación ofuscado, podrías llamarlo de otra manera. – extraneon

+0

@extra, lo he aclarado. –

2

self es this, solo tiene que pasarlo explícitamente y usarlo explícitamente para referirse a los métodos/propiedades de la clase.

No es opcional en los métodos de clase. Obtendrá un TypeError si intenta definir un método de clase sin al menos un argumento (es decir, el parámetro self).

Sin embargo, puede llamarlo de otra manera que no sea self, pero nunca he visto lo contrario.

+1

Debe reformular. ['classmethod'] (http://docs.python.org/library/functions.html#classmethod) es algo diferente. –

0

self se refiere al objeto sobre el que se llamó el método, al igual que this en C++. Pero es importante que self sea simplemente una convención , puede asignarle el nombre que desee y pasar instancias de subclases.

3

La alegría de Python

Eso es cierto hasta cierto punto. Los métodos son vinculados a la instancia del objeto de la que forman parte.Cuando vea

def some_func(self, foo, bar)

El paso de uno mismo es veces implícita cuando se llama, por ejemplo:

obj.some_func(foo_val, bar_val)

que es igual (suponiendo obj es de la clase MyClass) a

MyClass.some_func(obj, foo_val, bar_val)

Debido a que el método está obligado a obj, el argumento self se rellena. Esto es parte de que Python sea explícito con lo que significa. En otros idiomas, this simplemente aparece en el alcance, con Python hay alguna exposición de cómo sucede esto.

También se puede pasar alrededor de los métodos y pasar manualmente self cuando no está llamando desde un contexto determinado.

The Python docs do a good Job:

xf = x.f 
while True: 
    print xf() 

seguirá imprimiendo hola mundo hasta el fin del tiempo.

exactamente lo que sucede cuando se llama a un método? Puede haber notado que x.f() se llamó> sin un argumento anterior, aunque la definición de función para f() especificó un argumento>. ¿Qué pasó con la discusión? Sin duda, Python lanza una excepción cuando una función> que requiere un argumento se llama sin ningún - incluso si el argumento no es en realidad> utilizado ...

En realidad, es posible que haya adivinado la respuesta: Lo especial de los métodos es que el> objeto se pasa como el primer argumento de la función. En nuestro ejemplo, la llamada x.f() es> exactamente equivalente a MyClass.f (x). En general, llamar a un método con una lista de n argumentos> equivale a llamar a la función correspondiente con una lista de argumentos que se crea> insertando el objeto del método antes del primer argumento.

0

self es sin duda similar a this, sin embargo, en Python, el nombre self es sólo una convención, y podría ser nombrado otra cosa. La variable se llama como se llame en el prototipo de la función (def function(whatever, params...):).

Para métodos de instancia, self se requiere realmente. Para los métodos de clase o estáticos, debe especificar que se los debe tratar como tales, y luego no se requiere self. Por ejemplo:

def type_to_display(type): 
    """Converts a pass type to the full written pass type.""" 
    return list((pair[1] for pair in Pass.TYPE_CHOICES if pair[0] ==  
          type[0:1].upper()))[0]       
type_to_display = staticmethod(type_to_display)  

Usted nunca será capaz de utilizar un método de instancia de tal manera que el auto no se pasa en, por ejemplo, si tengo una instancia my_car de una clase Car, y utilizar el Car. método drive instancia de clase, la instancia de my_car se pasará implícitamente en el método drive como el primer parámetro (self).

class Car: 
    def drive(self): 
     self.do_some_stuff() 

my_car = Car() 
my_car.drive() # actually calls Car.drive(my_car) 
+0

llama a Car.drive (my_car) –

+0

Bah, gracias! Fijo. –

Cuestiones relacionadas