2016-09-08 13 views
0

私はpygameライブラリを使用しています。メソッドpygame.Surface()にはメソッドがたくさんあります。オブジェクトのインスタンス内に任意の属性を設定できません

my_surface = pygame.Surface((5,5)) #the object requires a size to instantiate 
my_surface.coords = (10,10) 

しかし、それは私に、このエラーがスローされます:これは私がやろうとしているものです私は

setattr(my_surface, 'coords', (10,10)) 

代わりの

my_surface.coords = (10,10) 
を使用する場合

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'pygame.Surface' object has no attribute 'coords' 

同じことが起こります

私は自分のクラスを作成する場合でも

class MyClass(): 
    pass 

instance = MyClass() 
instance.coords = (10,10) 

これは魅力的です。

私は、オブジェクトの各インスタンスに対して__dict__を持たないことと関係がありますが(デフォルトのpythonオブジェクト()について)、オブジェクトがあまりにも多くのメモリを使用する可能性があります。 I retur

instance.__dict__ #this is a MyClass() object 

ながら

my_surface.__dict__ #this is a pygame.Surface() object 

を行うことが

AttributeError: 'pygame.Surface' object has no attribute '__dict__' 

をスローしますns

{} 

この特定のインスタンスを修正して任意の属性を受け入れる方法はありますか?現在のところ、私が考えることができる唯一の回避策は、pygame.Surface()の子クラスを作成し、それに__dict__を与えることですが、明らかに、私が毎回任意の属性を追加する必要があるかどうかを、 Surface()のインスタンスを作成し、__dict__を使用してすべてのSurfaceをインスタンス化することで、最初に__dict__を持たない目的のすべてを無効にします。

答えて

1

Surface本当にがインスタンスに任意の属性を割り当てる必要がある場合、サブクラス化するよりも良い方法はないと思います。他の機能を追加する必要がない場合は、サブクラスを空にできます(インスタンス__dict__は自動的に作成されます)。

class MySurface(pygame.Surface): 
    pass 

しかし、本当にその能力が必要かどうかはわかりません。

優れたデザインは、あなたには、いくつかの他のオブジェクト型の属性として持つ他のどんなデータSurfaceオブジェクトとをカプセル化することが一般的です。 pygameのでは、多くの場合、(rect属性の一部として)座標でSurfaceimage属性として)をバンドルするpygame.sprite.Spriteのサブクラスを使用します。バンドルする必要がある他のデータがある場合、Spriteもそれを取ることができます。 Spriteインスタンスは、独自のサブクラスを記述しなくても、デフォルトで__dict__になります。

+0

徹底的に私の問題を説明するために研究している間、私は愚かなクソださて、私はあなたのソリューションつまずいたが、その後私は、オブジェクトが新しい属性を受け入れなかった理由は、 '__dict__'の欠如であることを発見したので、私はに行ってきましたコンソールと 'pygameを試してみました。Surface().__ dict__ 'を返し、何かを返したので、それはdictを持っていたので新しい属性を受け入れるべきだと思った。 30分後になっても、インスタンスには「__dict__」がないため、それができなかったことがわかりました。その時点で、私はまだ私の答えがあったので、私はまだ投稿しています。それにもかかわらず、ありがとうございました。 – Kwantuum

+0

@Kyll大変申し訳ありませんが、コメントの編集ボタンを見つけることができません。あなたの隣に小さいペンが表示されていますが、編集されているとわかりますので、私はそれを見ることはできません。私が見なければならない場所のスクリーンショットを共有してもよろしいですか? 編集:明らかに私はこの1つを編集できます。返信した後にコメントを編集できないのでしょうか? – Kwantuum

関連する問題