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

时间:2017-12-19 13:22:30

标签: python django python-3.x class inheritance

我有一个自定义Django mixin,如果某个应用为installed,则应将其导入/添加到视图类 ,例如

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

如何在Django中实现这一目标?

2 个答案:

答案 0 :(得分:4)

这不是一个好的设计实践或任何东西,但是你可以实现这一点的一种方法是尝试在应用程序启动时导入你的mixin,就像你通常一样,但是把它包装在try / except中,这样如果app如果未安装,则创建一个同名的存根类,它不执行任何操作。这样,在任何一种情况下都可以解析名称,并且在启动时不会出现任何导入错误。

这样的事情:

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

class MyView(LoginRequiredMixin, CustomMixin, View):
    pass

答案 1 :(得分:1)

传递给Python 3中的类定义的参数列表支持函数调用的所有功能,这意味着您可以在类基列表中使用function custom_add_products_to_cart(){ $request_body = file_get_contents('php://input'); $decoded = json_decode($request_body); $cartElements = $decoded->addToCart; foreach ( $cartElements as $product_id ) { WC()->cart->add_to_cart( $product_id ); } if ( $decoded->Uid ) { WC()->session->set( 'uid', $decoded->Uid ); } die(); }; *args - 样式参数:

**kwargs

或者,您可以使用metaclass

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)