2011-03-02 20 views
23

Quiero entender los argumentos del constructor __init__ en Python.__init__ y argumentos en Python

class Num: 
    def __init__(self,num): 
     self.n = num 
    def getn(self): 
     return self.n 
    def getone(): 
     return 1 
myObj = Num(3) 

print myObj.getn() 

RESULTADO: 3

que llamo el getone() método:

print myObj.getone() 

RESULTADO: Error 'getone()' no tiene argumentos (1given).

Así que reemplazar:

def getone(): 
    return 1 

con

def getone(self): 
    return 1 

RESULTADO: 1 Esto está bien.

Pero el método getone() no necesita argumentos.

¿Debo usar un argumento sin sentido?

+6

no tienen sentido. cada método de una clase siempre tiene un argumento implícito, la instancia. En C++ es lo mismo, pero nunca lo ves en la lista de argumentos porque mágicamente aparece en los arbustos del bosque de hadas.Python es 'Explícito es mejor que implícito'. –

+1

Puede usar los decoradores de @staticmethod y @classmethod para hacer lo que quiera. Por favor mira el ejemplo en mi respuesta. – stderr

Respuesta

31

Los métodos de instancia de Python requieren el auto argumento. Los métodos de clase toman la clase como primer argumento. Los métodos estáticos no requieren el argumento instancia (self) ni la clase (cls).

__init__ es una función especial y sin anular __new__ siempre se le dará la instancia de la clase como primer argumento.

Un ejemplo utilizando los classmethod y decoradores métodoestático incorporadas:

import sys 

class Num: 
    max = sys.maxint 

    def __init__(self,num): 
     self.n = num 

    def getn(self): 
     return self.n 

    @staticmethod 
    def getone(): 
     return 1 

    @classmethod 
    def getmax(cls): 
     return cls.max 

myObj = Num(3) 
# with the appropriate decorator these should work fine 
myObj.getone() 
myObj.getmax() 
myObj.getn() 

Dicho esto, me gustaría tratar de utilizar @classmethod/@staticmethod moderación. Si se encuentra creando objetos que consisten en nada más que staticmethod s, lo más pitónico sería crear un nuevo módulo de funciones relacionadas.

3

en Python debe pasar siempre en por lo menos un argumento a los métodos de clase, el argumento es self y no tiene sentido que es una referencia a la instancia en sí

4

El hecho de que el método no uso la self argumento (que es una referencia a la instancia a la que se adjunta el método) no significa que puede dejarlo fuera. Siempre tiene que estar allí, porque Python siempre intentará pasarlo.

2

El objeto actual se transfiere explícitamente al método como primer parámetro. self es el nombre convencional. Puede llamarlo como quiera, pero se recomienda encarecidamente que se apegue a esta convención para evitar confusiones.

Cuestiones relacionadas