2017-12-31 296 views
1

私はPythonでオブジェクト指向プログラミングを開始しましたが、クラスインスタンスを配列に格納することにしました。クラスインスタンスが配列に格納されている場合のクラス変数へのアクセス方法

class apixel(object): 
    def __init__(self): 
     self.posx = random.randint(0, 300) 
     self.posy = random.randint(0, 200) 
    def do_i_exist(): 
     print("Yes i do!") 

p = [apixel] * 10 

for obj in p: 
    obj.do_i_exist() #that works 
    print(obj.posx) #but that does not work 
+1

あなたのコードのみ「作品」あなたは間違って '自己を省略しているため'do_i_exist'メソッドの引数です。 –

答えて

4

問題は、そうでない場合は__init__が呼び出されることはありません、あなたが実際にオブジェクトをインスタンス化する必要があるということです。

試してみてください。以下のクレイグさんのコメントパー

p = [apixel() for _ in range(10)] 

あなたは10個の独立したオブジェクトを取得して、リストの内包は、コンストラクタを10回呼び出します。

apixelself.posxが含まれていなかったのは、コンストラクタがコードによって呼び出されたことがないということです。クラスのインスタンスのリストを作成するのではなく、のクラス定義への参照のリストを作成していました。

あなたのOPのパーDanielPrydenさんのコメント、あなたはselfを受け入れる、またはstaticとしてそれに注釈を付けるためにあなたのdo_i_existメソッドのシグネチャを変更する必要があり、次のいずれか

# as an instance method, which requires "self": 
do_i_exist(self): 
    ... 

# as a static class method that is the same for all instances: 
@staticmethod 
do_i_exist(): 
    ... method body contains NO references to "self" 
+0

ああ、ありがとう... – markop

+1

これは1つのオブジェクトの10のコピーを作成します。 OPは、10個の独立したオブジェクトを得るために 'p = [apixel()for _ range(10)]'のようなリストの理解を望んでいるでしょう。 – Craig

+1

良い点、私は編集します!それをキャッチしてくれてありがとう:) –

関連する問題