2014-10-03 83 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