2012-05-31 3 views
8

Ниже фрагмент коды дает мне ошибку по какой-то причине, может кто-нибудь сказать мне, что будет проблема ..Python класс - Супер переменная

В основном, я создаю 2 класса Направьте & Circle..THe circle пытается наследовать класс 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) 

Ошибка:

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

ли вы внести некоторые изменения в источнике? Ваш запрос 'init' выглядел так первоначально? –

+4

'ToString', о! мои (пифонические) глаза истекают кровью – juliomalegria

ответ

13

Похоже, что вы, возможно, уже исправили исходную ошибку, которая была вызвана super().__init__(x,y), как сообщение об ошибке указывает, хотя ваше исправление было немного неправильно, вместо super(Point, self) из класс Circle вы должны использовать super(Circle, self).

Обратите внимание, что есть одно место, которое вызывает super() неправильно, внутри Circle «s ToString() метода:

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

Это правильный код на Python 3, но на Python 2 super() требует аргументов, переписать как следующее:

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

Я хотел бы также рекомендовать, чтобы избавиться от продолжения строки, см Maximum Line Length section of PEP 8 для рекомендуемого способа фиксации этого.

+0

В сообщении об ошибке явно указано, что ошибка исходит от этой строки * not *. –

+0

@MarkRansom - Правильно! Благодарю. –

+0

вы должны порекомендовать, что 'ToString()' не является (вообще) правильным, чтобы думать, вот для чего '__str__'. – juliomalegria

7

super(..) занимает только классы нового стиля. Чтобы исправить это, увеличьте класс Point от object. Как это:

class Point(object): 

Также правильный способ использования супер (..), как:

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) 
Смежные вопросы