一連のクラスにわたってチェーンメソッドを作成しましたが、チェーンの最後のリンクの値を設定すると、クラスチェーン。例えばチェーンクラスのメソッドが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
ありがとう!
は、なぜあなたはここに 'type'がを呼び出している:リストで属性名を、あなたは
__init__
でsetattr
を使用していることを行うことができますか?あなたが使っているツールが実際にやろうとしていることが分からないように聞こえるかもしれません。 – user2357112基本クラスのプリセットメソッドを継承しながら、別のクラスのインスタンスである任意のメソッド(* _methodsリストを参照)を作成するために 'type'を使用しています。どのようにこれを行うだろうか? –