理解python类变量

时间:2013-01-06 05:32:12

标签: python class variables instance

为什么我们将template_name = None作为类变量?(来自django源代码)

这是因为如果self.template_name为None,会引发错误吗? (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]

1 个答案:

答案 0 :(得分:0)

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

由于没有构造函数,template_name显然被设置为类实例。它意味着它应该从子类中设置。此外,更改它的值将影响该mixin的所有未来实例。