一个Python Puzzler

时间:2014-10-03 17:00:57

标签: python oop design-patterns

如果您对如何在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()]。

这样做的一般动机是,我希望用户轻松添加类,而无需了解使用它们的类。任何帮助都会被批评。

3 个答案:

答案 0 :(得分:9)

Voila(感谢all_subclasses()的{​​{3}}):

# 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

答案 1 :(得分:2)

如果你知道有问题的模块,例如modulex,你可以使用dir(modulex)列出模块中的所有名称,然后为每个名称x使用{{1}得到实际的对象 然后检查它是否为modulex.__dict__.get(x)类型。

答案 2 :(得分: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