获取在多个python模块中定义的所有子类

获取在多个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子类 [] 所

我有两个python文件实现测试存储库工厂模式:

testrepository.py gitrepository.py 问题是repo\u type=TestRepository。上面示例中的子类是空的,如果我将所有类放在一个文件中,它就会工作:

>>> 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'>]