获取在多个python模块中定义的所有子类
我有两个python文件实现测试存储库工厂模式: testrepository.py gitrepository.py 问题是repo\u type=TestRepository。上面示例中的子类是空的,如果我将所有类放在一个文件中,它就会工作:获取在多个python模块中定义的所有子类,python,python-2.7,oop,subclass,Python,Python 2.7,Oop,Subclass,我有两个python文件实现测试存储库工厂模式: testrepository.py gitrepository.py 问题是repo\u type=TestRepository。上面示例中的子类是空的,如果我将所有类放在一个文件中,它就会工作: >>> print TestRepository.__subclasses__() [<class '__main__.GitRepository'>] >>>打印TestRepository.\uuuu子类 [] 所
>>> print TestRepository.__subclasses__()
[<class '__main__.GitRepository'>]
>>>打印TestRepository.\uuuu子类
[]
所以问题是如何从几个python模块中获取所有子类?为什么要扫描所有子类?它可能包括所有不可直接使用的东西,例如定义的抽象子类、测试子类等。相反,我会将每个感兴趣的(子)类注册到中央注册表中(例如,在导入时在模块初始化部分运行),还有比在
create_repo
中使用eval
更好的选项,最好的选项(IMO)是传递对要调用的函数的引用,而不是部分函数名。这一切背后的思想是在代码测试存储库中使用(更不用说存储库),如果是这样,以后我可以很容易地切换到任何其他类型的存储库。所以我需要动态加载TestRepository实现(GitRepository)。@chepner如果您想调用函数FooRepository
,将FooRepository
作为参数传递,然后直接调用它,您能说得更具体些吗;不要传递“Foo”
。为什么要扫描所有子类?它可能包括所有不可直接使用的东西,例如定义的抽象子类、测试子类等。相反,我会将每个感兴趣的(子)类注册到中央注册表中(例如,在导入时在模块初始化部分运行),还有比在create_repo
中使用eval
更好的选项,最好的选项(IMO)是传递对要调用的函数的引用,而不是部分函数名。这一切背后的思想是在代码测试存储库中使用(更不用说存储库),如果是这样,以后我可以很容易地切换到任何其他类型的存储库。所以我需要动态加载TestRepository实现(GitRepository)。@chepner如果您想调用函数FooRepository
,将FooRepository
作为参数传递,然后直接调用它,您能说得更具体些吗;不要通过“Foo”
。
from testrepository import TestRepository, RepositoryFactory
class GitRepository(TestRepository):
def __init__(self, server, dirpath, reponame):
super(GitRepository, self).__init__()
self.server = server
self.dirpath = dirpath
self.reponame = reponame
self.username = None
self.password = None
self.fullPath = path.join(self.dirpath, self.reponame)
def generate(self, username, password):
pass
def update(self):
pass
class Factory(object):
@staticmethod
def create(server, dirpath, reponame):
return GitRepository(server=server, dirpath=dirpath, reponame=reponame)
if __name__ == '__main__':
repo_type = TestRepository.__subclasses__().pop().__name__
repo = RepositoryFactory.create_repo(repo_type,
server='localhost',
dirpath='/home/user/git',
reponame='repo')
repo.generate(username='test', password='test')
repo.update()
>>> print TestRepository.__subclasses__()
[<class '__main__.GitRepository'>]