2009-04-20 69 views
4

在django.contrib.auth中间件 的一些内部我看到代码:Django的权威性中间件

class AuthenticationMiddleware(object): 
    def process_request(self, request): 
     assert hasattr(request, 'session'), "requires session middleware" 
     request.__class__.user = LazyUser() 
     return None 

请avdise我为什么这样的形式 request._ _.user = LazyUser( )使用 ? 为什么不只是 request.user = LazyUser() ?

我知道什么_ _属性意味着,但正如我所说的,直接赋值给实例变量会更好。我错在哪里?

回答

9

LazyUser是描述符类。根据documentation它可以是唯一的类属性不是实例之一:

例如,a.x具有查找链开始a.__dict__['x'],然后type(a).__dict__['x'],并通过type(a)不含元类的基类继续。

+0

哦,是的! 有时我真的很想念'pythonic'的思维方式:) Java的刻板印象依然存在...... – maxp 2009-04-20 13:56:25

-1

这将影响如何创建request。所有这些实例将具有它们的user属性作为特定的LazuUser,而不需要在每个个体request被实例化之后进行改变。