2009-04-20 76 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被實例化之後進行改變。