[英]How can I dynamically define the list of base classes for a Python class?
并不是说这是一种好的设计习惯,而是要实现的一种方法是尝试像通常那样在应用程序启动时导入mixin,但将其包装在try / except中,以便在未安装应用程序的情况下进行导入,您将创建一个不执行任何操作的同名存根类。 这样,无论哪种情况都可以解析名称,并且在启动时不会遇到任何导入错误。
像这样:
try:
from conditional_app import CustomMixin
except ImportError:
class CustomMixin(object):
pass
class MyView(LoginRequiredMixin, CustomMixin, View):
pass
传递给Python 3中的类定义的参数列表支持函数调用的所有功能,这意味着您可以在类基础列表中使用*args
和**kwargs
-style参数:
bases = [LoginRequiredMixin]
if apps.is_installed("some_app"):
bases.append(CustomMixin)
class MyView(*bases, View):
...
另外,您可以使用一个元类 :
from django.apps import apps
class MixinsMeta(type):
def __new__(cls, name, bases, namespace, **kwargs):
# customize the `bases` tuple here..
return super().__new__(cls, name, bases, namespace)
然后在视图中:
class MyView(View, metaclass=MixinsMeta):
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.