rig*_*rig 1 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'''
Run Code Online (Sandbox Code Playgroud)
我想要做的是当A类被实例化时,所有类型的B - (C和D)将在self._classes中被实例化,这意味着_classes是[C(),D()].
这样做的一般动机是,我希望用户轻松添加类,而无需了解使用它们的类.任何帮助都会被批评.
瞧(感谢这个答案的all_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()
Run Code Online (Sandbox Code Playgroud)
输出:
very cool stuff in C
very cool stuff in D
very cool stuff in E
Run Code Online (Sandbox Code Playgroud)