我可以使用python元类来跟踪单独文件中的子类吗?

时间:2014-11-09 21:26:22

标签: python django subclass metaclass

我是社区新手。在我的Django项目中,我有一个名为“social”的模块,其中我有几个文件,如facebook.py和twitter.py,每个文件的类都是“SocialProvider”的子类

实施例

class Facebook(SocialProvider):

在我的社交模块中还有一个名为“helper.py”的文件,其中包含一个SocialProviderHelper,我想跟踪所有SocialProvider子类,并为它们生成不同的列表和标识符。例如.. SocialProviderHelper可以“找到”Facebook和Twitter,并将它们添加到各种列表,如cool_providers = [] popular_providers = [] old_providers等等。目标是创建一个通用的SocialProviderHelper,其他代码区域可以导入使用...例如..在视图中我可能想要获得所有“popular_providers”名称..所以我会导入SocialProviderHelper ..并执行类似

的操作
helper = SocialProviderHelper()
helper.getOldProviders()

在我的SocialProviderHelper中,我有:

class SocialProviderHelper(object):
    _providers = SocialProvider.__subclasses__()

但     的子类() 返回一个空列表,似乎是因为“提供者”是在未导入的其他文件中定义的,而子类()只保留对类的弱引用(如果它们是“活着的”)。

有什么方法吗?

**最终目标是能够通过简单的方式在任何地方掀起SocialProvider的另一个子类。

import SocialProvider
    class NewSocialNetwork(SocialProvider)

...让SocialProviderHelper知道它的存在。**

我尝试使用保存子类注册表的元类来实现“子类()”,但类似的问题仍然存在。

1 个答案:

答案 0 :(得分:0)

这可以通过装饰者完成:

from SocialProvider import SocialProvider

@SocialProvider.Register
class NewSocialProvider( SocialProvider ):
    pass

我认为SocialProvider是你写的超类。如果是这样,在您的超类文件中,可以将Register帮助器定义为类方法:

class SocialProvider:

    subclasses = []
    @classmethod
    def Register( cls, subcl ):
        cls.subclasses.append( subcl )
        return subcl

如果没有,那么你仍然可以在某个地方定义一个函数,用作装饰器,但它和它附加的列表必须在其他地方定义,与SocialProvider类分开。你提到了尚未导入文件的问题。您无法检测尚未定义的类,因此您必须确保导入具有子类定义的文件(例如,通过模块的import facebook文件中的___init__.py等语句。