4 votes

Comment créer une sous-classe en python qui est héritée du module tortue ?

J'essaie d'apprendre le python et à chaque fois que je pose une question ici, j'ai l'impression de céder...

J'essaie de créer ma propre classe de turtle.Turtle.

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

my_turtle = TurtleGTX()
my_turtle.forward(10)

Donne le Traceback : AttributeError : L'objet 'TurtleGTX' n'a pas d'attribut '_position'. J'apprends alors qu'il s'agit d'un "private vairable" qui, d'après le tutoriel officiel de Python, peut être modifié/override dans ma sous-classe TurtleGTX. Comment faire cela avec un programme aussi grand que la tortue semble plutôt difficile et implique qu'il me manque une solution plus simple au problème. En fin de compte, j'ai appris et c'était le but, mais j'aimerais quand même le soumettre à la communauté pour voir s'il y a une façon élégante de créer une sous-classe de turtle.Turtle. (L'étape suivante est de faire en sorte que votre tortue se comporte différemment de la tortue standard).

Un commentaire ci-dessous m'a fait penser que je pourrais peut-être le faire :

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

my_turtle = TurtleGTX()
my_turtle.forward(100)

qui fonctionne réellement ! Maintenant je vais voir où cela me mène... quelque chose me dit que j'ai peut-être fait un pas en avant et deux pas en arrière car cela signifie que je ne pourrai pas initialiser quoi que ce soit dans ma sous-classe...

8voto

Odomontois Points 3371

Pour compléter la réponse d'Ignacio et le commentaire d'orokusaki, vous devriez probablement écrire quelque chose comme

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)

2voto

Si vous redéfinissez une méthode (telle que __init__() ) dans une classe enfantine, il est de votre responsabilité d'appeler la méthode du parent afin que le comportement de ce dernier soit respecté.

0voto

ggorlen Points 5267

Il est tentant de sous-classer Turtle et ajouter des fonctionnalités personnalisées, par exemple, turtle.jump() . Mais j'ai eu peu de succès avec ce modèle et je le déconseille dans la plupart des cas.

Appel t = Turtle() (y compris les sous-classes de Turtle ) enregistre l'objet dans la liste interne des tortues du module turtle. Cette liste a _update() appelé par image si vous ne désactivez pas la boucle de mise à jour interne avec la commande turtle.tracer(0) . Cette tortue interne n'est pas susceptible d'être ramassé comme votre sous-classe pourrait s'y attendre et nous ne devrions pas accéder aux méthodes privées désignées par le trait de soulignement qui les précède. Même si nous le pouvons, cela devient rapidement compliqué, en plus des méthodes internes de mise à jour et de dessin auxquelles elles sont liées, Turtle possède de nombreuses propriétés et méthodes que vous pouvez facilement nommer clash vos méthodes personnalisées.

Je propose l'un des quelques modèles alternatifs qui sont quelque peu spécifiques à un cas d'utilisation :

  • Si cela ne vous dérange pas que les tortues ne soient pas ramassées (vous gagnez un montant fixe que vous comptez conserver), vous pouvez allouer des instances d'une classe personnalisée, chacune d'entre elles ayant une instance interne de self.turtle = Turtle() qui est manipulée normalement à partir de l'enveloppe.
  • Au lieu de classes, vous pourriez faire Turtle et les transmettre à des fonctions qui leur font accomplir une action de manière impérative, à la manière du langage C : def jump(turtle, height): ... .
  • Si vous prévoyez de créer des particules qui sont créées et détruites relativement fréquemment et que vous avez juste besoin d'une tortue pour les rendre, vous pouvez stocker les représentations internes des particules et les propriétés physiques avec une référence à une seule tortue "stylo". Lorsque le dessin est nécessaire, le traçage est désactivé et la tortue est déplacée d'une position à l'autre parmi toutes les particules partagées, en dessinant selon les besoins.

Cela dit, je serais ravi de voir un cas utile de sous-classement si quelqu'un en a un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X