如何动态定义Python类的基类列表?

2024-04-25 13:03:37 发布

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

我有一个自定义的Djangomixin,只有在某些应用程序是installed的情况下,才应该导入/添加到视图类中

class MyView(LoginRequiredMixin, CustomMixin, View):
    #                            ^
    #                            this is an optional mixin
    pass

如何在Django实现这一点?在


Tags: installedanview视图应用程序is情况this
2条回答

这并不是说这是一个好的设计实践或其他方法,但是可以实现的一种方法是尝试在应用程序启动时导入mixin,就像通常那样,但是将其包装在try/except中,这样,如果没有安装应用程序,则可以创建一个同名的存根类,而不执行任何操作。这样,在任何一种情况下都可以解析名称,并且您不会在启动时遇到任何导入错误。在

像这样:

try:
    from conditional_app import CustomMixin
except ImportError:
    class CustomMixin(object):
        pass

class MyView(LoginRequiredMixin, CustomMixin, View):
    pass

在Python3中传递给类定义的参数列表支持函数调用的所有功能,这意味着您可以在类基列表中使用*args和{}-样式的参数:

bases = [LoginRequiredMixin]

if apps.is_installed("some_app"):
    bases.append(CustomMixin)

class MyView(*bases, View):
    ...

或者,您可以使用metaclass

^{pr2}$

然后在视图中:

class MyView(View, metaclass=MixinsMeta):
    ...

相关问题 更多 >