2013-01-06 137 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