2016-04-29 8 views
0

一連のクラスにわたってチェーンメソッドを作成しましたが、チェーンの最後のリンクの値を設定すると、クラスチェーン。例えばチェーンクラスのメソッドが1つしか設定されていないときに上書きする

sub0.one.some.a.time_t.raw = 1 
sub0.one.some.b.time_t.raw = 2 

しかし:

print sub0.one.some.a.time_t.raw 

戻る2(ない1、上記したように)

print sub0.one.some.b.time_t.raw 

戻り2

コードは以下の通りです。 Sub0はチェーンのトップレベルで、Sub4が最も低くなります。 type()メソッドを使用して、クラスのインスタンスをクラス内のメソッドとして追加します。

sub0.one.some.a.time_t.rawは、私が設定した通りに1を返すのはなぜですか?チェーン内のすべてのクラスの別々のインスタンスではありませんか?

class Sub4(object): 
    pass 

class Sub3(object): 
    pass 

class Sub2(object): 
    pass 

class Sub1(object): 
    def __init__(self, config): 
     self.config_field = config['flag'] 

class Sub0(object): 
    def __init__(self, config): 
     self.config = config 


sub4_methods = ['raw'] 
Sub4 = type("Sub4", (Sub4,), { sub4:None for sub4 in sub4_methods}) 

sub3_methods = ['time_t'] 
Sub3 = type("Sub3", (Sub3,), { sub3:Sub4() for sub3 in sub3_methods}) 

sub2_methods = ['a', 'b'] 
Sub2 = type("Sub2", (Sub2,), { sub2:Sub3() for sub2 in sub2_methods}) 

sub1_methods = ['all', 'some'] 
Sub1 = type("Sub1", (Sub1,), { sub1:Sub2() for sub1 in sub1_methods}) 

configs = { 
    "one": { "flag": True }, 
    "two": { "flag": False }, 
    } 
Sub0 = type("Sub0", (Sub0,), { k:Sub1(v) for (k,v) in zip(configs.keys(), configs.values())}) 

#create class instance 
sub0 = Sub0(configs) 

#set values 
sub0.one.some.a.time_t.raw = 1 
sub0.one.some.b.time_t.raw = 2 

#both of these return 1, even though they are set to 1 & 2 respectively 
print sub0.one.some.a.time_t.raw 
#returns 1 

print sub0.one.some.b.time_t.raw 
#returns 1 

ありがとう!

+0

は、なぜあなたはここに 'type'がを呼び出している:リストで属性名を、あなたは__init__setattrを使用していることを行うことができますか?あなたが使っているツールが実際にやろうとしていることが分からないように聞こえるかもしれません。 – user2357112

+0

基本クラスのプリセットメソッドを継承しながら、別のクラスのインスタンスである任意のメソッド(* _methodsリストを参照)を作成するために 'type'を使用しています。どのようにこれを行うだろうか? –

答えて

2

type()メソッドを使用して、クラス内のメソッドをクラス内のメソッドとして追加します。

これはtypeではありません。 typeはまったく新しいクラスです。あなたがそれを認識していても(あなたはそうではないように思われますが)、あなたがしようとしていることに対して、奇妙で不適切な選択です。

チェーン内のすべてのクラスの別々のインスタンスではありませんか?

いいえ。この属性チェーン内のすべてのオブジェクトは共有されています。

あなたはSub0インスタンスがなどの属性としてSub2オブジェクトを持っている属性やSub1オブジェクトとしてSub1オブジェクトを持つようにしたい場合は、__init__で、それを通常の方法を実行します。

class Sub0(object): 
    def __init__(self): 
     self.one = Sub1({"flag": True}) 
     self.two = Sub1({"flag": False}) 

class Sub1(object): 
    def __init__(self): 
     self.all = Sub2() 
     self.some = Sub2() 
... 

あなたを定義する場合

class Sub1(object): 
    def __init__(self): 
     for name in ['all', 'some']: 
      setattr(self, name, Sub2()) 
関連する問題