2012-05-31 11 views
8

La pieza que está debajo del código es que me da un error por alguna razón, ¿Puede alguien decirme cuál sería el problema ..clase de Python - Super variables

Básicamente, crean 2 clases de punto & Circle..THe círculo está tratando de heredar la clase Point.

Code: 


class Point(): 

    x = 0.0 
    y = 0.0 

    def __init__(self, x, y): 
     self.x = x 
     self.y = y 
     print("Point constructor") 

    def ToString(self): 
     return "{X:" + str(self.x) + ",Y:" + str(self.y) + "}" 

class Circle(Point): 
    radius = 0.0 

    def __init__(self, x, y, radius): 
     super(Point,self).__init__(x,y) 
     self.radius = radius 
     print("Circle constructor") 

    def ToString(self): 
     return super().ToString() + \ 
       ",{RADIUS=" + str(self.radius) + "}" 


if __name__=='__main__': 
     newpoint = Point(10,20) 
     newcircle = Circle(10,20,0) 

error:

C:\Python27>python Point.py 
Point constructor 
Traceback (most recent call last): 
    File "Point.py", line 29, in <module> 
    newcircle = Circle(10,20,0) 
    File "Point.py", line 18, in __init__ 
    super().__init__(x,y) 
TypeError: super() takes at least 1 argument (0 given) 
+0

¿Tienes ediciones a la fuente? ¿Tu llamada 'init' se veía así originalmente? –

+4

'ToString', ¡oh! mis ojos (pitónicos) están sangrando – juliomalegria

Respuesta

13

Parece que es posible que ya haya solucionado el error original, que fue causado por super().__init__(x,y) como el mensaje de error indica que, a pesar de su arreglo fue ligeramente incorrecta, en lugar de super(Point, self) de la clase Circle debe usar super(Circle, self).

Tenga en cuenta que hay otro lugar que llama super() incorrectamente, en el interior de Circle 's ToString() método:

 return super().ToString() + \ 
       ",{RADIUS=" + str(self.radius) + "}" 

Esto es código válido en Python 3, pero en Python 2 super() requiere argumentos, reescribir esto como el siguiente:

 return super(Circle, self).ToString() + \ 
       ",{RADIUS=" + str(self.radius) + "}" 

yo también recomiendo deshacerse de la continuación de línea, ver la Maximum Line Length section of PEP 8 por la forma recomendada de fijación del mismo.

+0

El mensaje de error indica explícitamente que el error * no * proviene de esa línea. –

+0

@MarkRansom - ¡Lo tienes! Gracias. –

+0

deberías recomendar que 'ToString()' no sea (en absoluto) el pensamiento correcto para hacer, para eso sirve '__str__'. – juliomalegria

7

super(..) toma solo clases de nuevo estilo. Para solucionarlo, amplíe la clase Punto desde object. De esta manera:

class Point(object): 

También la forma correcta de utilizar super (..) es como:

super(Circle,self).__init__(x,y) 
0
class Point(object): 

x = 0.0 
y = 0.0 

def __init__(self, x, y): 
    self.x = x 
    self.y = y 
    print("Point constructor") 

def ToString(self): 
    return "{X:" + str(self.x) + ",Y:" + str(self.y) + "}" 

class Circle(Point,object): 
radius = 0.0 

def __init__(self, x, y, radius): 
    super(Circle,self).__init__(x,y) 
    self.radius = radius 
    print("Circle constructor") 

def ToString(self): 
    return super(Circle, self).ToString() + \ 
      ",{RADIUS=" + str(self.radius) + "}" 


if __name__=='__main__':  
    newpoint = Point(10,20)  
    newcircle = Circle(10,20,0) 
Cuestiones relacionadas