python, наследование, метод super ()

Я новичок в python, у меня есть код, ниже которого я просто не могу приступить к работе: - Это наследование, у меня есть базовый класс круга, и я наследую его внутри класса circle (здесь только одно наследование).

Я понимаю, что проблема заключается в функции ToString() в классе circle, в частности в строке text = super(Point, self).ToString() +.., для которой требуется хотя бы один аргумент, но я получаю следующее:

AttributeError: 'super' object has no attribute 'ToString'

Я знаю, что super не имеет атрибута ToString, но класс Point имеет -

Мой код:

class Point(object):
    x = 0.0
    y = 0.0

    # point class constructor
    def __init__(self, x, y):
        self.x = x
        self.y = y
        print("point constructor")

    def ToString(self):
        text = "{x:" + str(self.x) + ", y:" + str(self.y) + "}\n"
        return text

class Circle(Point):
    radius = 0.0

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

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


shapeOne = Point(10,10)
print( shapeOne.ToString() ) # this works fine

shapeTwo = Circle(4, 6, 12)
print( shapeTwo.ToString() ) # does not work

person user1937226    schedule 29.12.2012    source источник


Ответы (1)


Вместо этого вам нужно передать класс Circle:

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

super() будет просматривать базовые классы первого аргумента, чтобы найти следующий ToString() метод, а Point не имеет родителя с этим методом.

После этого изменения результат будет следующим:

>>> print( shapeTwo.ToString() )
{x:0.0, y:0.0}
{radius = 12}

Обратите внимание, что вы делаете ту же ошибку в своем __init__; вы вообще не называете унаследованный __init__. Это работает:

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

а затем вывод становится:

>>> shapeTwo = Circle(4, 6, 12)
point constructor
circle constructor
>>> print( shapeTwo.ToString() )
{x:4, y:6}
{radius = 12}
person Martijn Pieters    schedule 29.12.2012
comment
Большое спасибо (!), это еще один шаг, но не желаемый результат, поэтому я думаю, что я сделал что-то еще не так. Теперь я получаю это - точечный конструктор {x: 10, y: 10} конструктор круга {x: 0.0, y: 0.0} {radius = 12} - person user1937226; 30.12.2012
comment
когда мой круговой объект был, shapeTwo = Circle (4, 6, 12) - person user1937226; 30.12.2012
comment
Поэтому я должен был спросить, как мне передать точки x, y от круга до точки? - person user1937226; 30.12.2012
comment
Хорошо, спасибо, теперь я понимаю - чтобы было ясно, чтобы использовать унаследованную инициализацию, мне нужно передать текущий класс в super (), а также необходимые аргументы? например, super (inheritedClass, self) .__ init __ (аргументы базового класса)? - person user1937226; 30.12.2012