国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

深入理解Python中各種方法的運作原理

2020-02-23 01:36:52
字體:
來源:轉載
供稿:網友

方法在Python中是如何工作的

方法就是一個函數,它作為一個類屬性而存在,你可以用如下方式來聲明、訪問一個函數:
 

>>> class Pizza(object):...   def __init__(self, size):...     self.size = size...   def get_size(self):...     return self.size...>>> Pizza.get_size<unbound method Pizza.get_size>

Python在告訴你,屬性_get_size是類Pizza的一個未綁定方法。這是什么意思呢?很快我們就會知道答案:
 

>>> Pizza.get_size()Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: unbound method get_size() must be called with Pizza instance as first argument (got nothing instead)

我們不能這么調用,因為它還沒有綁定到Pizza類的任何實例上,它需要一個實例作為第一個參數傳遞進去(Python2必須是該類的實例,Python3中可以是任何東西),嘗試一下:
 

>>> Pizza.get_size(Pizza(42))

太棒了,現在用一個實例作為它的的第一個參數來調用,整個世界都清靜了,如果我說這種調用方式還不是最方便的,你也會這么認為的;沒錯,現在每次調用這個方法的時候我們都不得不引用這個類,如果不知道哪個類是我們的對象,長期看來這種方式是行不通的。

那么Python為我們做了什么呢,它綁定了所有來自類_Pizza的方法以及該類的任何一個實例的方法。也就意味著現在屬性get_size是Pizza的一個實例對象的綁定方法,這個方法的第一個參數就是該實例本身。
 

>>> Pizza(42).get_size<bound method Pizza.get_size of <__main__.Pizza object at 0x7f3138827910>>>>> Pizza(42).get_size()42

和我們預期的一樣,現在不再需要提供任何參數給_get_size,因為它已經是綁定的,它的self參數會自動地設置給Pizza實例,下面代碼是最好的證明:
 

>>> m = Pizza(42).get_size>>> m()42

更有甚者,你都沒必要使用持有Pizza對象的引用了,因為該方法已經綁定到了這個對象,所以這個方法對它自己來說是已經足夠了。

也許,如果你想知道這個綁定的方法是綁定在哪個對象上,下面這種手段就能得知:
 

>>> m = Pizza(42).get_size>>> m.__self__<__main__.Pizza object at 0x7f3138827910>>>> # You could guess, look at this:...>>> m == m.__self__.get_sizeTrue

顯然,該對象仍然有一個引用存在,只要你愿意你還是可以把它找回來。

在Python3中,依附在類上的函數不再當作是未綁定的方法,而是把它當作一個簡單地函數,如果有必要它會綁定到一個對象身上去,原則依然和Python2保持一致,但是模塊更簡潔:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 旬邑县| 辽宁省| 大石桥市| 金门县| 同仁县| 杭锦旗| 汕头市| 石河子市| 宁都县| 彭阳县| 卓资县| 牙克石市| 岳西县| 连平县| 高雄市| 巴林右旗| 肃南| 公安县| 会泽县| 石门县| 河间市| 静海县| 丹巴县| 翁牛特旗| 新密市| 独山县| 冷水江市| 宜兰县| 遵义县| 德钦县| 郁南县| 宜君县| 巫溪县| 巨野县| 磐安县| 靖边县| 安岳县| 扎赉特旗| 芒康县| 江津市| 鄯善县|