2013-01-06 138 views
0

为什么我们TEMPLATE_NAME =无作为类变量吗?(从Django中的源代码)理解蟒蛇类变量

这是因为如果self.template_name是无,会产生一个错误?
(self.template_name会找实例变量,如果它不存在,将返回类变量)
如果是的话,那岂不是更好有def __init__(self): self.template_name = None ?

class TemplateResponseMixin(object): 
    """                                                                  
    A mixin that can be used to render a template.                                                        
    """ 
    template_name = None 
    response_class = TemplateResponse 

    def render_to_response(self, context, **response_kwargs): 
     """                                                                 
     Returns a response with a template rendered with the given context.                                                 
     """ 
     return self.response_class(
      request = self.request, 
      template = self.get_template_names(), 
      context = context, 
      **response_kwargs 
     ) 

    def get_template_names(self): 
     """                                                                 
     Returns a list of template names to be used for the request. Must return                                                
     a list. May not be called if render_to_response is overridden.                                                   
     """ 
     if self.template_name is None: 
      raise ImproperlyConfigured(
       "TemplateResponseMixin requires either a definition of " 
       "'template_name' or an implementation of 'get_template_names()'") 
     else: 
      return [self.template_name] 

回答

0

TemplateResponseMixin是一个mixin是不使用init,使其更易于在多个继承中使用。它不需要它自己的状态,所以它不需要构造函数。这也使得继承更容易,因为你不需要在你的子类中调用构造函数。

template_name被设置为一个类实例,显然是因为没有构造函数。这意味着它应该从子类中设置。另外,改变它的值会影响所有未来的mixin的实例。

+0

谢谢。问题为mixin。 Mixin的另一个名字是“函数组合”? – eugene

+0

@Eugene不,函数组合是一个完全不相关的概念(它是对函数的操作,而Mixin是一种类)。 – delnan

+0

哦,我只是编造了这个词,不知道是否有一个术语“功能组合”..我的意思是“混合是将功能组合在另一个类中”。 (反对将另一个类中的函数/数据结合起来,这将成为继承) – eugene