Según lo que he leído, el parámetro 'self' es similar a 'this'.python y usar 'self' en los métodos
¿Es eso cierto?
Si es opcional, ¿qué harías si no pasaras el método?
Según lo que he leído, el parámetro 'self' es similar a 'this'.python y usar 'self' en los métodos
¿Es eso cierto?
Si es opcional, ¿qué harías si no pasaras el método?
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)
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
"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
@extra, lo he aclarado. –
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.
Debe reformular. ['classmethod'] (http://docs.python.org/library/functions.html#classmethod) es algo diferente. –
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.
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.
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)
llama a Car.drive (my_car) –
Bah, gracias! Fijo. –
cls es para 'métodos de clase', lo que significa que los métodos estáticos son correctos? – Blankman
No, en Python [métodos estáticos] (http://docs.python.org/library/functions.html # staticmethod) son diferentes. –
@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