python,如何批量创建类?
我是python的新手,我想创建3个类,如下所示: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
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。