2011-06-03 127 views
1

假設我有兩個類:瞭解Python類初始化

class A(): 
    pass 

class B(): 
    pass 

我有另一個類

class C(object): 
    def __init__(self, cond): 
     if cond ==True: 
      # class C initialize with class A 
     else: 
      # class C initialize with class B 

如果我從A或B繼承,由此實現這可能嗎?

+2

你到底想達到什麼目的?您編寫代碼的方式,類「C」與「A」或「B」無關。 – katrielalex 2011-06-03 16:27:43

+1

你也忘記了兩個下劃線;它應該是'__init__'。 – katrielalex 2011-06-03 16:28:59

+1

這就是我想寫一個類作爲另外兩個類的包裝...並且想要通過一個類來訪問這兩個類的對象。 – 2011-06-03 16:30:11

回答

4

如果要設置類,請使用__class__變量。

class C(object): 
    def __init__(self, cond): 
     if cond ==True: 
      self.__class__ = A 
     else: 
      self.__class__ = B 
     self.__class__.__init__(self) 
+0

好的解決方法..謝謝 – 2011-06-03 16:42:16

+2

呃!沒有!毛!不要這樣做! – katrielalex 2011-06-04 07:06:49

1

你的意思是你想根據cond的值進行某種混合?

如果是這樣嘗試

class C(object): 
    def __init(self, cond): 
     if cond ==True: 
      self.__bases__ += A 
     else: 
      self.__bases__ += B 

我不是100%肯定這是可能的,因爲也許它只能C. 基地 + = A.如果這是不可能的,那麼你正在嘗試做的是可能不可能。 C應該從A繼承或從B繼承。

+0

AttributeError:'C'對象沒有屬性'__bases__'也不能正常工作 – 2011-06-03 16:47:09

3

既然你沒有給出一個很好的例子,爲什麼這可能會有用,我只是假設你不瞭解面向對象。

什麼你正在試圖做的可能是某種工廠模式:

def something_useful(cond): 
    if cond: 
     return A() 
    else: 
     return B() 

myobj = something_useful(cond) 

或者也許你想聚集:

class C(object): 
    def __init__(self, something_useful): 
     # store something_useful because you want to use it later 
     self.something = something_useful 

# let C use either A or B - then A and B really should inherit from a common base 
if cond: 
    myobj = C(A()) 
else: 
    myobj = C(B()) 
+0

是的,您可以將'something_useful'重命名爲'C',這是一個簡單的解決方案。 – 9000 2011-06-03 16:37:10

1

雖然我不會像約亨嚴重,我會說你很可能採取了錯誤的做法。即使有可能,使用multiple inheritance以及擁有AC和BC類別也會更好。

如:

class A(): 
    pass 

class B(): 
    pass 

class C(): 
    #do something unique which makes this a C 
    pass 

#I believe that this works as is? 
class AC(A,C): 
    pass 

class BC(B,C): 
    pass 

這種方式,你可以簡單地調用

def get_a_c(cond): 
    if cond == True: 
     return AC() 
    return BC()