4

だから、私はPythonを学ぼうとしていますが、ここに質問を投稿するたびに、諦めているような気がします...

私は自分のクラスのカメを作ろうとしています。カメ。

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

my_turtle = TurtleGTX()
my_turtle.forward(10)

トレースバックを提供します:AttributeError:'TurtleGTX'オブジェクトには属性'_position'がありません。次に私が学ぶのは、公式のpythonチュートリアルによると、サブクラスTurtleGTXでマングル/オーバーライドできる「プライベートvairable」です。カメと同じくらい大きなプログラムでこれを行う方法はかなり難しいようで、問題のより簡単な解決策が欠けていることを意味します。結局、私は学び、それがポイントでしたが、それでもコミュニティによって実行して、turtle.Turtleのサブクラスを作成するエレガントな方法があるかどうかを確認したいと思います。(次のステップは、カメの動作を標準のカメとは異なるものにすることです)

だから、以下のコメントは私に多分私がこれをすることができると思いました:

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


my_turtle = TurtleGTX()
my_turtle.forward(100)

どの実際の実行!今、私はそれが私をどこに導くかを見るつもりです...これは私が私のサブクラスで何も初期化することができないことを意味するので私が1ステップ前に2ステップ戻ったかもしれないと何かが私に言います...

4

3 に答える 3

8

Ignacioの回答とorokusakiのコメントをまとめると、おそらく次のように書く必要があります。

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)
于 2012-02-25T07:42:50.037 に答える
2

子クラスでメソッド(など__init__())を再定義する場合、親の動作を尊重するために、親のメソッドを呼び出すのはユーザーの責任です。

于 2012-02-25T04:53:01.947 に答える
0

たとえば、カスタム機能をサブクラス化Turtleして追加するのは魅力的なパターンturtle.jump()です。しかし、私はこのパターンで限られた成功しか収めておらず、ほとんどの場合それに対して注意を払っています。

t = Turtle()(のサブクラスを含む)を呼び出すTurtleと、オブジェクトがタートルモジュールのタートルの内部リストに登録されます。_update()で内部更新ループを無効にしない場合、このリストはフレームごとに呼び出されますturtle.tracer(0)。この内部タートルは、サブクラスが期待するようにガベージコレクションを取得する可能性は低く、先頭の下線で示されるプライベートメソッドにフックするべきではありません。できたとしても、すぐに散らかってしまいます。それらがフックされている更新/描画内部に加えて、Turtleカスタムメソッドとの衝突に簡単に名前を付けることができる多くのプロパティとメソッドがあります。

ユースケース固有のいくつかの代替パターンの1つを提案します。

  • カメがガベージコレクションされない(維持する予定の固定量を作成している)ことを気にしない場合は、カスタムクラスのインスタンスを割り当てることができます。各self.turtle = Turtle()インスタンスには、通常の方法で操作される内部インスタンスがあります。ラッパー。
  • クラスの代わりに、Turtleインスタンスを作成して関数に渡し、Cスタイルの命令型の方法でアクションを実行させることができますdef jump(turtle, height): ...
  • 比較的頻繁に作成および破棄されるある種のパーティクルを作成する予定で、それらをレンダリングするためにタートルが必要な場合は、単一の「ペン」タートルを参照して、パーティクルの内部表現と物理プロパティを保存できます。描画が必要な場合、トレースは無効になり、タートルはすべての共有パーティクル内である位置から次の位置に移動し、必要に応じて描画します。

そうは言っても、誰かがサブクラス化パターンを持っているなら、私はサブクラス化パターンの有用なケースを見たいと思っています。

于 2022-02-05T23:41:21.103 に答える