inicio y argumentos en Python


Quiero entender los argumentos del constructor __init__ 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

Llamo al método getone():

print myObj.getone()

RESULTADO: El error 'getone()' no toma argumentos (1given).

Así que sustituyo:

def getone():
    return 1

Con

def getone(self):
    return 1

RESULTADO: 1 Esto está bien.

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

¿Tengo que usar argumentos sin sentido?

Author: ivanleoncz, 2011-03-02

5 answers

En Python:

  • Métodos de instancia: requieren el argumento self.
  • Métodos de clase: toma la clase como primer argumento.
  • Métodos estáticos: no requieren el argumento instance (self) o class (cls).

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

Un ejemplo usando el classmethod incorporado y decoradores de método estadístico:

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, trataría de usar @classmethod/@staticmethod con moderación. Si te encuentras creando objetos que consisten en nada más que staticmethods, lo más pitónico sería crear un nuevo módulo de funciones relacionadas.

 38
Author: stderr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-25 04:05:29

Cada método necesita aceptar un argumento: La instancia en sí (o la clase si es un método estático).

Lea más sobre las clases en Python.

 6
Author: Felix Kling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-02 14:58:16

El hecho de que su método no use el argumento self (que es una referencia a la instancia a la que se adjunta el método) no significa que pueda omitirlo. Siempre tiene que estar ahí, porque Python siempre va a intentar pasarlo.

 4
Author: kindall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-02 15:01:21

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

 2
Author: Jordan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-02 14:58:29

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

 2
Author: neil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-02 15:04:58