2014-10-03 132 views
1

如果有,我應該如何執行蟒蛇以下任務的任何建議,我很困惑: 假設我有以下類:一個Python益智遊戲

class A(object): 
    self._classes = [] 
    def magic(self): 
     c.foo() for c in self._classes 

class B(object): 
    def foo():'''some cool stuff here''' 

class C(B): 
    def foo():'''very cool stuff''' 

class D(B): 
    def foo():'''very cool stuff''' 

我想要做的是,當A級是實例化所有類型的B - (C和D)將在self._classes中進行檢測,這意味着_classes是[C(),D()]。

對此的一般動機是我希望用戶輕鬆地添加類,而無需知道使用它們的類。任何幫助將被處理。

+0

爲什麼不直接實例C&d的實例在A的__init__方法?我猜測這個問題比這更復雜。 – 2014-10-03 17:05:05

+1

@ TonySuffolk66我的猜測是,也可以有'E類(B)','F類(B)'和'SpamEggsAndHam(B)'' – 2014-10-03 17:06:32

+0

以上是一個玩具的例子。假設B類被20個類所劃分,或者超過了20個類,如果創建了B的一個子類的一個新實例,那麼我就沒有興趣觸及A類。 – rig 2014-10-03 17:09:35

回答

9

瞧(感謝this answerall_subclasses()):

# recursively get all subclasses of a given class 
def all_subclasses(cls): 
    return cls.__subclasses__() + [g for s in cls.__subclasses__() 
            for g in all_subclasses(s)] 

class B(object): 
    def foo(self): print '''some cool stuff here in B''' 

class C(B): 
    def foo(self): print '''very cool stuff in C''' 

class D(B): 
    def foo(self): print '''very cool stuff in D''' 

class E(D): 
    def foo(self): print '''very cool stuff in E''' 

class A(object): 
    def __init__(self): 
     self._classes = [cls() for cls in all_subclasses(B)] 

    def magic(self): 
     for c in self._classes: c.foo() 

# usage: 
A().magic() 

輸出:

very cool stuff in C 
very cool stuff in D 
very cool stuff in E 
+0

唉你打我很長一段時間......但很好的回答(+1) – 2014-10-03 17:23:03

+0

這絕對是一些有趣的東西。當我在做Django開發時,我會使用這種東西。 – TehTris 2014-10-03 17:25:15

2

如果你知道例如modulex有問題的模塊,你可以使用dir(modulex)列出模塊中的所有名稱,然後爲每個名字x可以使用modulex.__dict__.get(x)獲得實際的對象。
然後檢查它是否爲B

0

在Python中你可以存儲像列表其他方法的對象,所以首先請注意,您需要定義其他類然後將它們存儲在列表中,還需要使用self作爲foo函數參數!如果你還沒有子類,你可以這樣做:

class B(object): 
    def foo(self): 
     print 'B' 

class C(B): 
    def foo(self): 
     print 'C' 

class D(B): 
    def foo(self): 
     print 'D' 

class A(object): 

    def __init__(self): 
    self._classes = [B(),C(),D()] 
    def magic(self): 
     for c in self._classes: 
      c.foo() 

A().magic() 

resoult:

B 
C 
D