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

2024-09-26 22:54:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新来的。在我的Django项目中,我有一个名为“social”的模块,其中有几个文件脸谱网.py,和twitter.py,每个类都是“SocialProvider”的子类

示例

class Facebook(SocialProvider):

在我的社交模块中还有一个名为“助手.py“它包含一个SocialProviderHelper,我希望它跟踪所有SocialProvider子类,并为它们生成不同的列表和标识符。例如。。SocialProviderHelper可以“找到”Facebook和Twitter,并将它们添加到各种列表中,如cool_providers=[]popular_providers=[]旧的_Provider等。其目标是制作一个通用的SocialProviderHelper,其他代码区域可以导入和使用。。。例如。。在我看来,我可能想得到所有的“热门供应商”的名字。。所以我要导入SocialProviderHelper。。做一些类似的事情

^{pr2}$

在我的SocialProviderHelper中,我有:

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

但是 子类() 似乎返回一个空列表,因为“providers”是在其他尚未导入的文件中定义的,子类()仅在“活动”时维护对该类的弱引用。在

有什么办法吗?在

**最终目标是通过做。。在

import SocialProvider
    class NewSocialNetwork(SocialProvider)

…让社会提供者知道它的存在。**

我曾试图用一个保存子类注册表的元类实现“子类”,但类似的问题仍然存在。在


Tags: 模块文件项目djangopy列表facebooksocial
1条回答
网友
1楼 · 发布于 2024-09-26 22:54:43

这可以通过一个装饰工来完成:

from SocialProvider import SocialProvider

@SocialProvider.Register
class NewSocialProvider( SocialProvider ):
    pass

我假设SocialProvider是您编写的超类。如果是这样,在超类文件中,Register助手可以定义为类方法:

^{pr2}$

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

相关问题 更多 >

    热门问题