我是社区新手。在我的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知道它的存在。**
我尝试使用保存子类注册表的元类来实现“子类()”,但类似的问题仍然存在。
答案 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
等语句。