這是 tornado.web.py 文件中一段
@property
def cookies(self):
"""An alias for `self.request.cookies <.httputil.HTTPServerRequest.cookies>`."""
return self.request.cookies
這個 cookie 函數是在一個類里面,這個 self 應該是調用這個 cookie 的那個對象
比如 a.cookies(),self 就是那個 a。
那么 cookies 作為被修飾函數
比如修飾函數形式是這樣(我在那個源碼文件中沒找到 property 這個函數。。)
def property(f1):
def wrapper():
..
return f1()
return wrapper
則調用 cookies <=> 調用 property(cookies)
那么這個被修飾函數的參數 self 是怎么傳進這個修飾函數里面的呢
ps: 我為什么在源碼文件中沒有找到那個 property() 修飾函數,我都用 ctrl+f 找也沒找到
tornado.web.py源碼地址
你如果對於 decorator 還有疑問的話, 可以參考 這篇文章
關於 decorator, 基本上一共有三個函數:
decorator: 裝飾器/修飾器/修飾函數
orifunc: 原函數/被修飾函數
wrapper: 新函數/取代函數
簡單地可以表達為:
def decorator(orifunc):
# do something here (register...)
def wrapper(*args, **kwargs):
# do something before (preprocess)
result = orifunc()
# do something after (postprocess)
return result
return wrapper
他們的關係是:
wrapper = decorator(orifunc)
可以用甜頭寫法表示為:
@decorator
def orifunc(*args, **kwargs):
# do something...
decorator 在執(zhí)行裝飾的時候,只會將 orifunc 包裝並回傳, 其實就是用 wrapper 取代掉。
修飾這個步驟呼叫的的是 decorator, 傳遞的參數是 orifunc, 返回值是 wrapper, 這個時候 orifunc (或是他的包裝替代品 wrapper 都還沒被呼叫, 只有 decorator 被呼叫), 所以原函數 orifunc 的參數根本不會傳遞進修飾函數(decorator) 中。
只有當我們呼叫裝飾過後的函數 wrapper 時才需要傳入 orifunc 需要的參數 (orifunc 和 wrapper 的參數介面應當一致)。
回到你的問題, 當 property 被呼叫的時候, 調用的函數是 property, 傳入的參數是原函數 cookies, 返回值是 wrapper, 這時跟 self 都還沒有關係。
當我們呼叫被修飾過的函數 wrapper(也就是property(cookies)) 才需傳入與 cookies 相同的參數, 此時 self 才被傳入。
self.cookies() <=> property(cookies)(self)
^^^^^^^^^^^^^^^^^
修飾的這步尚與 self 無關
<=> wrapper(self)
^^^^^^^^^^^^^
調用 wrapper 時才與 self 有關
P.S. property 是 python 的內建函數, 並非 tornado 特有的東西, 你可以在 python doc 中找到說明。
我回答過的問題: Python-QA
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數據專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯想擔任系統開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統架構師,美國AngelEngineers Inc. 系統架構師。