2017-07-19 4 views
0

クラスの異なるインスタンス間でデータを共有したいが、クラスが初めて作成されたときにデータを外部に渡す必要がある。initに渡される引数を使用してクラス変数を1回だけ初期化する方法

私は以下のスニペットを書いています。

動作しているようです
class Foo(object): 

    _config = False 
    eggs = None 

    def __init__(self, spam, eggs=None): 

     if Foo._config: 
      # Assume initialized and eggs exists 
      print(Foo.eggs) 

     else: 
      if eggs is None: 
       raise ValueError('eggs must be provided the first time') 
      else: 
       Foo.eggs = eggs 
       Foo._config = True 
       print("Scrambled {}?".format(Foo.eggs)) 

     self.spam = spam 
     print("Class variable - eggs: {}".format(Foo.eggs)) 
     print("Instance variable - spam: {}".format(self.spam)) 

...

>>>Foo._config 
False 
>>>a = Foo('chicken', 'eggs')  
Scrambled eggs? 
Class variable - eggs: eggs 
Instance variable - spam: chicken 
>>>Foo._config 
True 

2回目はエラーと共有変数のクラスを上げていない

>>>b = Foo('duck') 
eggs 
Class variable - eggs: eggs 
Instance variable - spam: duck 

私の質問はこれがあるかどうかであります良いアプローチ?私は__init__のものを一度だけ呼び出されるものを含むことは悪い考えであり、私はメタクラスを使うべきであるというこの質問を見ましたか?

私の正当な理由は、の卵には、実際には各インスタンスで繰り返さない非常に大きなパンダのデータフレームが含まれているということです。

+1

は、なぜあなたはちょうど同じ正確な大きなパンダのデータフレームを初期化しませんか?参照のコストはごくわずかです。 –

+0

クラスのすべてのインスタンスが同じパンダデータフレームを共有するようにしますか? 1つのインスタンスから変更すると、すべてが変更されますか? – Erich

+0

@ juanpa.arrivillaga私の無知を許してください。しかし、データフレームが 'df'の場合、' __init__'の中で 'self.df = df'を呼び出すと毎回同じデータフレームを参照しますか? – drstevok

答えて

0

これを行う1つの方法は、すべてのオブジェクトが共有する定数値をインスタンス化するために、最初に呼び出す@classmethodを作成することです。

+0

これは一度しか実行されないようにするにはどうすればよいですか? '__init__'に相当するクラスがありますか? – drstevok

+0

私は認識していません。私たちのコードベースでは、この動作が必要なクラスがあるので、 'initialize'クラスメソッドを作成しました。 'もし卵が無ければ'とチェックすると、クラスメソッドが少なくとも一回呼び出されたことがチェックされます。 – Y0da

+0

それは私より穏やかなアプローチのように聞こえる。ありがとうございます – drstevok

1

クラスネームスペースの使用をお勧めします。 参照:

class holder(): 
    x = 5 
    def __init__(self): 
     self.x = 6 
     return; 

alpha = holder() 
beta=holder() 
beta.x = 4 
holder.x = 100 
print(holder.x) 
print(alpha.x) 
print(beta.x) 

> 100 
> 6 
> 4 

変数のスコープは非常に迅速に希釈されます。私は定数のクラス名前空間を予約します。

クラスネームスペースで参照を設定しようとすると、以前にパンダデータフレームを生成する必要があります。オブジェクトを作成する前にコードのどこかに生成し、各クラスへの参照によって渡す方が簡単になるでしょう。 @のjuanpa.arrivillagaで述べたように

:self.df = DF

関連する問題