2016-06-14 2 views
2

私はAクラスのすべてのオブジェクトで使用される静的または外部のリストを持つ必要があります。コンストラクタargsに基づいて静的メンバーを初期化する方法はありますか?

def initialize(x, y): 
    for i in range(0, x): 
     static_to_return.append([]) 
     for j in range(0, y): 
      static_to_return[i].append((i * x) + 1 + y) 
    return static_to_return 


class A: 
    static_member = initialize(x, y) 

    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

どのようにこの作品を作るために:リストの値は、例えば、一度だけ初期化する必要があり、コンストラクタのパラメータから取られるべき? static_memberを別のモジュールに移動する方が良いでしょうか?または__init__の機能でstatic_memberに書き込むことは可能ですか?

+0

それはありませんあなたが何を期待しているのかを明確にしてください。これは静的メンバー(実際は:class属性)か、すべてのインスタンスに提供されるコンストラクタパラメータから初期化する必要がありますか? 'A'の2番目のインスタンスを作成するとどうなりますか?クラスファクトリ( 'A = build_A_with(x、y)')はより良いアプローチですか?どこで(そしていつ) 'x'と' y'が出てくるのでしょうか? – jonrsharpe

+0

多くの 'A'クラスオブジェクトがあり、それらのすべてが同じ' x'と 'y'値を持ちます。私が必要とするのは、コンストラクタのパラメータに基づいて、 'A'クラスの最初のインスタンス化でこの属性を初期化することです。 – Kacper

+1

それらがすべて同じ 'x'と' y'を持っているなら、なぜそれらは '__init__'パラメータですか?これらは、すべてのインスタンスごとに異なるものを設定するために使用されます。値はどこから来るのでしょうか?もっと文脈を与えることができますか?これは[XY(hah!)の問題](http://meta.stackexchange.com/q/66377/248731)と思われます。 – jonrsharpe

答えて

3

あなたは静的メンバは、クラスの最初オブジェクトから初期化したい場合は、クラス定義でNoneに初期化してから、インスタンスコンストラクタでその値をテストすることができます:

class A: 
    static_member = None 

    def __init__(self, x, y): 
     self.x = x 
     self.y = y 
     if A.static_member is None: # still not initialized? 
      A.static_member = initialize(x, y) # ok, here it is 
-1

あなたが実際にインスタンスが作成されたときにクラスが作成、されていない場合xyを提供したいように思えます。すべてのインスタンスが同じ値を共有する場合は、__init__にパラメータとして指定する必要はありません。

あなたのクラスは、あなたがこのためにa metaclassを使用する必要があるかもしれませんが、そのような単純な例で、あなただけのtypeを使用することができますどのように複雑な依存:

x = 1 
y = 2 
A = type('A', (object,), dict(x=x, y=y, static_member=initialize(x, y))) # * 

これは、あなたがしたいクラスとインスタンスのすべてを作成し、あなたが期待している状態を共有:

>>> a = A() 
>>> b = A() 
>>> a.static_member 
[[3, 3]] 
>>> b.static_member 
[[3, 3]] 
>>> a.static_member.append(['foo', 'bar']) 
>>> a.static_member 
[[3, 3], ['foo', 'bar']] 
>>> b.static_member 
[[3, 3], ['foo', 'bar']] 
>>> A.static_member 
[[3, 3], ['foo', 'bar']] 

*私は行を追加する必要がありますこれを実行するには、〜initializeを入力します。

関連する問題