2016-04-29 59 views
0

我創建鏈接的方法在一組類,但是當我在鏈條的最後一個環節設置的值,它是什麼,我想改寫值分別爲內單獨的實例類鏈。鏈類方法覆蓋彼此當只有一個被設置

例如:

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'這裏?這聽起來像你可能不知道你使用的工具實際上應該做什麼。 – user2357112

+0

我使用'type'來創建任意方法(請參閱* _methods lists),這些方法是另一個類的實例,同時繼承基類中的所有預設方法。其他人怎麼做呢? –

回答

2

我使用type()方法在類中添加類的實例作爲方法。

這不是type所做的。 type是一個全新的課程。即使你意識到這一點(你看起來並不像),對於你想要做的事情來說,這是一個奇怪的和不合適的選擇。

是不是鏈中的所有類的單獨的實例?

號這個屬性鏈中的所有對象是共享的。

如果你想Sub0實例有Sub1對象屬性和Sub1對象有Sub2對象作爲屬性等等,這樣做的正常方式,__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() 
... 

如果要定義與列表屬性名,你能做到這一點使用__init__setattr

class Sub1(object): 
    def __init__(self): 
     for name in ['all', 'some']: 
      setattr(self, name, Sub2())