2008-11-23 7 views
7

ADVERTENCIA: He estado aprendiendo Python durante los 10 minutos, así que me disculpo por cualquier pregunta estúpida.Python: Problema con los constructores sobrecargados

he escrito el código siguiente, sin embargo tengo la siguiente excepción:

Message File Name Line Position Traceback Node 31 exceptions.TypeError: this constructor takes no arguments

class Computer: 

    name = "Computer1" 
    ip = "0.0.0.0" 
    screenSize = 17 


    def Computer(compName, compIp, compScreenSize): 
     name = compName 
     ip = compIp 
     screenSize = compScreenSize 

     printStats() 

     return 

    def Computer(): 
     printStats() 

     return 

    def printStats(): 
     print "Computer Statistics: --------------------------------" 
     print "Name:" + name 
     print "IP:" + ip 
     print "ScreenSize:" , screenSize // cannot concatenate 'str' and 'tuple' objects 
     print "-----------------------------------------------------" 
     return 

comp1 = Computer() 
comp2 = Computer("The best computer in the world", "27.1.0.128",22) 

¿Alguna idea?

+0

Ver http://stackoverflow.com/questions/92230/python-beyond-the-basics –

Respuesta

36

Supongo que proviene de un fondo Java-ish, por lo que hay algunas diferencias clave que señalar.

class Computer(object): 
    """Docstrings are used kind of like Javadoc to document classes and 
    members. They are the first thing inside a class or method. 

    You probably want to extend object, to make it a "new-style" class. 
    There are reasons for this that are a bit complex to explain.""" 

    # everything down here is a static variable, unlike in Java or C# where 
    # declarations here are for what members a class has. All instance 
    # variables in Python are dynamic, unless you specifically tell Python 
    # otherwise. 
    defaultName = "belinda" 
    defaultRes = (1024, 768) 
    defaultIP = "192.168.5.307" 

    def __init__(self, name=defaultName, resolution=defaultRes, ip=defaultIP): 
     """Constructors in Python are called __init__. Methods with names 
     like __something__ often have special significance to the Python 
     interpreter. 

     The first argument to any class method is a reference to the current 
     object, called "self" by convention. 

     You can use default function arguments instead of function 
     overloading.""" 
     self.name = name 
     self.resolution = resolution 
     self.ip = ip 
     # and so on 

    def printStats(self): 
     """You could instead use a __str__(self, ...) function to return this 
     string. Then you could simply do "print(str(computer))" if you wanted 
     to.""" 
     print "Computer Statistics: --------------------------------" 
     print "Name:" + self.name 
     print "IP:" + self.ip 
     print "ScreenSize:" , self.resolution //cannot concatenate 'str' and 'tuple' objects 
     print "-----------------------------------------------------" 
+4

La respuesta del día. Claro, eficiente, realista. –

5

Los constructores en Python se llaman __init__. También debe usar "self" como primer argumento para todos los métodos en su clase, y usarlo para establecer variables de instancia en la clase.

class Computer: 

    def __init__(self, compName = "Computer1", compIp = "0.0.0.0", compScreenSize = 22): 
     self.name = compName 
     self.ip = compIp 
     self.screenSize = compScreenSize 

     self.printStats() 

    def printStats(self): 
     print "Computer Statistics: --------------------------------" 
     print "Name:", self.name 
     print "IP:", self.ip 
     print "ScreenSize:", self.screenSize 
     print "-----------------------------------------------------" 


comp1 = Computer() 
comp2 = Computer("The best computer in the world", "27.1.0.128",22) 
+0

printStatus tiene un error: no se declara a sí mismo. – Pramod

+0

¡Ja! ¡Gafe! Ingresamos a la misma solución. –

+0

¡Gracias por su ayuda, funcionó una delicia! ¡Realmente supongo que debería haber leído un tutorial antes de bucear! –

1

Eso no es válido python.

El constructor para una clase de Python es def __init__(self, ...): y no puede sobrecargarlo.

Lo que puede hacer es usar valores predeterminados para los argumentos, ej.

class Computer: 
    def __init__(self, compName="Computer1", compIp="0.0.0.0", compScreenSize=17): 
     self.name = compName 
     self.ip = compIp 
     self.screenSize = compScreenSize 

     self.printStats() 

     return 

    def printStats(self): 
     print "Computer Statistics: --------------------------------" 
     print "Name  : %s" % self.name 
     print "IP  : %s" % self.ip 
     print "ScreenSize: %s" % self.screenSize 
     print "-----------------------------------------------------" 
     return 

comp1 = Computer() 
comp2 = Computer("The best computer in the world", "27.1.0.128",22) 
2

Hay una serie de cosas a destacar:

  1. Todos los métodos de instancia en Python tienen un argumento auto expreso.
  2. Los constructores se llaman __init__.
  3. No se pueden sobrecargar los métodos. Puede lograr un efecto similar al usar argumentos de método predeterminados.

C++:

class comp { 
    std::string m_name; 
    foo(std::string name); 
}; 

foo::foo(std::string name) : m_name(name) {} 

Python:

class comp: 
    def __init__(self, name=None): 
    if name: self.name = name 
    else: self.name = 'defaultName' 
+0

¿Puedes decir que soy un programador de C#? –

1

Ah, estos son errores comunes para los nuevos desarrolladores de Python.

En primer lugar, el constructor debe ser llamado:

__init__() 

Su segunda cuestión es olvidar incluir el parámetro auto a métodos de su clase.

Además, cuando define el segundo constructor, está reemplazando la definición del método Computer(). Python es extremadamente dinámico y te permitirá redefinir alegremente los métodos de clase.

La forma más pythonic es probablemente utilizar valores predeterminados para los parámetros si no desea que sean necesarios.

4

dude consiga un libro del pitón.Sumérgete en Python es bastante bueno.

+1

Sí, me doy cuenta de esto ahora ... ya que no puedo obtener un libro real por al menos otras 16 horas, pensé que me sumergiría en ... después de todo "¡¿qué tan difícil puede ser ?!" –

+0

Encuentra un libro en línea. Aquí hay uno: http://homepage.mac.com/s_lott/books/python.html –

1

Python no es compatible con la sobrecarga de funciones.

Cuestiones relacionadas