2013-10-17 38 views
1

可能的重複: Is there a way to create subclasses on-the-fly? Dynamically creating classes - PythonPython的動態子類

我想創建一個子類,其中唯一的區別是一些類變量,但我想一切保持不變。我需要動態執行此操作,因爲我只知道運行時的類變量值。

以下是一些示例代碼。我希望FooBase.foo_var是「默認」,但是FooBar.foo_var是「bar」。到目前爲止,沒有嘗試成功。

class FooBase(object): 
    foo_var = "default" 

    def __init__(self, name="anon"): 
     self.name = name 

    def speak(self): 
     print self.name, "reporting for duty" 
     print "my foovar is '" + FooBase.foo_var + "'" 


if __name__ == "__main__": 
    #FooBase.foo_var = "foo" 
    f = FooBase() 
    f.speak() 

    foobarname = "bar" 
    #FooBar = type("FooBar", (FooBase,), {'foo_var': "bar"}) 
    class FooBar(FooBase): pass 
    FooBar.foo_var = "bar" 
    fb = FooBar() 
    fb.speak() 

非常感謝

編輯所以我顯然有這一行的一個問題:在代碼

print "my foovar is '" + FooBase.foo_var + "'"

接受的答案有self.foo_var。這就是我應該做的。我現在覺得很荒謬。

回答

1

這個什麼:

def make_class(value): 
    class Foo(object): 
    foo_var = value 

    def speak(self): 
     print self.foo_var 
    return Foo 

FooBar = make_class("bar") 
FooQux = make_class("qux") 

FooBar().speak() 
FooQux().speak() 

這就是說,你不能讓foo_var的價值是你的類的實例變量?因此,使用不同輸入實例化的同一類將以不同的方式運行,而不是爲每個不同的行爲創建不同的類。

+0

謝謝,我失蹤了'self.foo_var'。我寧願有一個類變量而不是一個實例變量的原因是,我會擁有大量的實例,但可能只有1-3個子類。 – liang

+0

基於這種動機,我認爲你應該讓foo_var成爲一個實例變量。在沒有實例變量的情況下,創建你的這些實例將會同樣快速。這聽起來像你正試圖優化一些東西,而不需要太多。 –

+0

是的,你是對的。我有壓力盡可能地優化這一點。我會嘗試帶/不帶類變量,看看是否有任何區別(可能不是) – liang