python,如何批量创建类?

python,如何批量创建类?,python,Python,我是python的新手,我想创建3个类,如下所示: class ProtectTemplate(TemplateView): @method_decorator(login_required) def dispatch(self, *args, **kwargs): return super(ProtectTemplate, self).dispatch(*args, **kwargs) def get_context_data(self, **kwar

我是python的新手,我想创建3个类,如下所示:

class ProtectTemplate(TemplateView):
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ProtectTemplate, self).dispatch(*args, **kwargs)

    def get_context_data(self, **kwargs):
        context['phone'] = xxx
        return context


class ProtectList(ListView):
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ProtectList, self).dispatch(*args, **kwargs)

    def get_context_data(self, **kwargs):
        context['phone'] = xxx
        return context


class ProtectDetail(DetailView):
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ProtectDetail, self).dispatch(*args, **kwargs)

    def get_context_data(self, **kwargs):
        context['phone'] = xxx
        return context
login_class = [
    ('ProtectTemplate', TemplateView),
    ('ProtectList', ListView),
    ('ProtectDetail', DetailView),
]

for c, v in login_class:
    class c(v):
        @method_decorator(login_required)
        def dispatch(self, *args, **kwargs):
            return super(self.__class__, self).dispatch(*args, **kwargs)

        def get_context_data(self, **kwargs):
            context['phone'] = xxx
            return context
我觉得很糟糕。所以我试着做以下几点:

class ProtectTemplate(TemplateView):
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ProtectTemplate, self).dispatch(*args, **kwargs)

    def get_context_data(self, **kwargs):
        context['phone'] = xxx
        return context


class ProtectList(ListView):
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ProtectList, self).dispatch(*args, **kwargs)

    def get_context_data(self, **kwargs):
        context['phone'] = xxx
        return context


class ProtectDetail(DetailView):
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ProtectDetail, self).dispatch(*args, **kwargs)

    def get_context_data(self, **kwargs):
        context['phone'] = xxx
        return context
login_class = [
    ('ProtectTemplate', TemplateView),
    ('ProtectList', ListView),
    ('ProtectDetail', DetailView),
]

for c, v in login_class:
    class c(v):
        @method_decorator(login_required)
        def dispatch(self, *args, **kwargs):
            return super(self.__class__, self).dispatch(*args, **kwargs)

        def get_context_data(self, **kwargs):
            context['phone'] = xxx
            return context

但它不起作用。是否仍有批量创建3类的方法?

您的循环是正确的方法,但是您正在重新绑定
c
(没有为类设置新的全局名称),您不能在
class
语句中使用变量来命名类(该类将被称为
c
),并使用
super(self.\u class\uuuuuuuuuuuuuuuuuuuuuu,self)
will

您可以改为使用工厂函数,然后使用
globals()
字典将新创建的类添加到全局命名空间中。该函数提供了一个闭包,因此我们可以将实际的类对象传递给
super()

super(LoginCls,self)
表达式在父函数名称空间中将
LoginCls
作为非本地名称查找,因此始终使用正确的上下文在MRO中查找下一个类

我使用前导下划线名称表示工厂函数和
\u login\u class
\u name
\u base
名称是模块的实现细节

演示:

>>类基:
...     def dispatch(self,*args,**kwargs):打印('Base.dispatch({},{})调用'.format(args,kwargs))
...
>>>类TemplateView(基本):通过
...
>>>类ListView(基本):通过
...
>>>类详细视图(基本):通过
...
>>>方法\u decorator=lambda*args:lambda f:f
>>>xxx='xxx'
>>>login\u required='login\u required'
>>>定义创建登录类(名称、基):
...     类登录名(基本):
...         @方法\u装饰器(需要登录)
...         def调度(自身、*args、**kwargs):
...             返回super(LoginCls,self).dispatch(*args,**kwargs)
...         def获取上下文数据(自身,**kwargs):
...             上下文['phone']=xxx
...             返回上下文
...     登录名
...     LoginCls.\uuuuqalname\uuuuu=name\Python 3
...     返回登录
...
>>>\u登录\u类=[
…('ProtectTemplate',TemplateView),
…('ProtectList',ListView),
…('ProtectDetail',DetailView),
... ]
>>>对于_name,_basein _login_类:
...     globals()[\u name]=\u创建\u登录\u类(\u name,\u base)
...
>>>保护模板
>>>类子类Demo(ProtectTemplate):
...     def调度(自身、*args、**kwargs):
...         print('SubclassDemo.dispatch({},{})调用'.format(args,kwargs))
...         super(子类demo,self).dispatch(*args,**kwargs)
...
>>>子类demo().dispatch(42,spam='ham')
调用子类demo.dispatch((42,),{'spam':'ham'})
调用了Base.dispatch((42,),{'spam':'ham'})
请告诉我们第二次尝试如何无效。请注意,
super(self.\uu class\uuuuuuuuuuuuuuuuuuu,self)
将导致无限递归错误,因为
self.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。