Как создать подкласс в python, унаследованный от модуля черепахи

Итак, я пытаюсь изучить Python, и каждый раз, когда я задаю здесь вопрос, мне кажется, что я сдаюсь...

Я пытаюсь создать свой собственный класс черепахи. Черепаха.

    import turtle
class TurtleGTX(turtle.Turtle):
    """My own version of turtle"""
    def __init__(self):
        pass

my_turtle = TurtleGTX()
my_turtle.forward(10)

Дает Traceback: AttributeError: объект «TurtleGTX» не имеет атрибута «_position». Затем я узнаю, что это «частная переменная», которую, согласно официальному руководству по Python, я могу изменить/переопределить в своем подклассе TurtleGTX. Как сделать это с такой большой программой, как черепаха, кажется довольно сложным и подразумевает, что мне не хватает более простого решения проблемы. В конце концов я узнал, и в этом была суть, но я все равно хотел бы запустить его сообществом, чтобы увидеть, есть ли элегантный способ создать подкласс черепахи. Черепаха. (Следующий шаг — сделать так, чтобы ваша черепаха вел себя иначе, чем стандартная черепаха)

Итак, комментарий ниже заставил меня подумать, что, возможно, я мог бы сделать это:

import turtle
class TurtleGTX(turtle.Turtle):
    """My own version of turtle"""


my_turtle = TurtleGTX()
my_turtle.forward(100)

какие настоящие пробеги! Теперь я собираюсь посмотреть, куда это меня приведет... что-то подсказывает мне, что я, возможно, сделал 1 шаг вперед и два шага назад, поскольку это означает, что я не смогу ничего инициализировать в своем подклассе...


person Drew Verlee    schedule 25.02.2012    source источник


Ответы (2)


Завершая ответ Игнасио и комментарий орокусаки, вы, вероятно, должны написать что-то вроде

import turtle
class TurtleGTX(turtle.Turtle):
    """My own version of turtle"""
    def __init__(self,*args,**kwargs):
        super(TurtleGTX,self).__init__(*args,**kwargs)
        print("Time for my GTX turtle!")

my_turtle = TurtleGTX()
my_turtle.forward(100)
person Odomontois    schedule 25.02.2012
comment
Спасибо за помощь, возможно, я неправильно понял вопрос, который задавал учебник, поскольку они никогда не вводили super, *args или **kwargs... - person Drew Verlee; 25.02.2012

Если вы переопределяете метод (например, __init__()) в дочернем классе, то вы несете ответственность за вызов родительского метода, чтобы уважать поведение родителя.

person Ignacio Vazquez-Abrams    schedule 25.02.2012
comment
Также обратите внимание, что ваш init должен принимать те же аргументы, kwargs, что и родитель, и вам нужно вызвать инициализацию super() с аргументами, kwargs, если только вы не собираетесь переписывать интерфейс. - person orokusaki; 25.02.2012