9.3.4. 方法對(duì)象
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、網(wǎng)頁(yè)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、瓊結(jié)網(wǎng)站維護(hù)、網(wǎng)站推廣。
通常,方法通過(guò)右綁定方式調(diào)用:
x.f()
在 MyClass 示例中,這會(huì)返回字符串 'hello world'。然而,也不是一定要直接調(diào)用方法。 x.f 是一個(gè)方法對(duì)象,它可以存儲(chǔ)起來(lái)以后調(diào)用。例如:
xf = x.f
while True:
print(xf())
會(huì)不斷的打印 hello world。
調(diào)用方法時(shí)發(fā)生了什么?你可能注意到調(diào)用 x.f() 時(shí)沒(méi)有引用前面標(biāo)出的變量,盡管在 f() 的函數(shù)定義中指明了一個(gè)參數(shù)。這個(gè)參數(shù)怎么了?事實(shí)上如果函數(shù)調(diào)用中缺少參數(shù),Python 會(huì)拋出異常--甚至這個(gè)參數(shù)實(shí)際上沒(méi)什么用……
實(shí)際上,你可能已經(jīng)猜到了答案:方法的特別之處在于實(shí)例對(duì)象作為函數(shù)的第一個(gè)參數(shù)傳給了函數(shù)。在我們的例子中,調(diào)用 x.f() 相當(dāng)于 MyClass.f(x) 。通常,以 n 個(gè)參數(shù)的列表去調(diào)用一個(gè)方法就相當(dāng)于將方法的對(duì)象插入到參數(shù)列表的最前面后,以這個(gè)列表去調(diào)用相應(yīng)的函數(shù)。
如果你還是不理解方法的工作原理,了解一下它的實(shí)現(xiàn)也許有幫助。引用非數(shù)據(jù)屬性的實(shí)例屬性時(shí),會(huì)搜索它的類。如果這個(gè)命名確認(rèn)為一個(gè)有效的函數(shù)對(duì)象類屬性,就會(huì)將實(shí)例對(duì)象和函數(shù)對(duì)象封裝進(jìn)一個(gè)抽象對(duì)象:這就是方法對(duì)象。以一個(gè)參數(shù)列表調(diào)用方法對(duì)象時(shí),它被重新拆封,用實(shí)例對(duì)象和原始的參數(shù)列表構(gòu)造一個(gè)新的參數(shù)列表,然后函數(shù)對(duì)象調(diào)用這個(gè)新的參數(shù)列表。
【常見的內(nèi)置函數(shù)】
1、enumerate(iterable,start=0)
是python的內(nèi)置函數(shù),是枚舉、列舉的意思,對(duì)于一個(gè)可迭代的(iterable)/可遍歷的對(duì)象(如列表、字符串),enumerate將其組成一個(gè)索引序列,利用它可以同時(shí)獲得索引和值。
2、zip(*iterables,strict=False)
用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的列表。如果各個(gè)迭代器的元素個(gè)數(shù)不一致,則返回列表長(zhǎng)度與最短的對(duì)象相同,利用*號(hào)操作符,可以將元組解壓為列表。
3、filter(function,iterable)
filter是將一個(gè)序列進(jìn)行過(guò)濾,返回迭代器的對(duì)象,去除不滿足條件的序列。
4、isinstance(object,classinfo)
是用來(lái)判斷某一個(gè)變量或者是對(duì)象是不是屬于某種類型的一個(gè)函數(shù),如果參數(shù)object是classinfo的實(shí)例,或者object是classinfo類的子類的一個(gè)實(shí)例,
返回True。如果object不是一個(gè)給定類型的的對(duì)象, 則返回結(jié)果總是False
5、eval(expression[,globals[,locals]])
用來(lái)將字符串str當(dāng)成有效的表達(dá)式來(lái)求值并返回計(jì)算結(jié)果,表達(dá)式解析參數(shù)expression并作為Python表達(dá)式進(jìn)行求值(從技術(shù)上說(shuō)是一個(gè)條件列表),采用globals和locals字典作為全局和局部命名空間。
【常用的句式】
1、format字符串格式化
format把字符串當(dāng)成一個(gè)模板,通過(guò)傳入的參數(shù)進(jìn)行格式化,非常實(shí)用且強(qiáng)大。
2、連接字符串
常使用+連接兩個(gè)字符串。
3、if...else條件語(yǔ)句
Python條件語(yǔ)句是通過(guò)一條或多條語(yǔ)句的執(zhí)行結(jié)果(True或者False)來(lái)決定執(zhí)行的代碼塊。其中if...else語(yǔ)句用來(lái)執(zhí)行需要判斷的情形。
4、for...in、while循環(huán)語(yǔ)句
循環(huán)語(yǔ)句就是遍歷一個(gè)序列,循環(huán)去執(zhí)行某個(gè)操作,Python中的循環(huán)語(yǔ)句有for和while。
5、import導(dǎo)入其他腳本的功能
有時(shí)需要使用另一個(gè)python文件中的腳本,這其實(shí)很簡(jiǎn)單,就像使用import關(guān)鍵字導(dǎo)入任何模塊一樣。
python的一切數(shù)據(jù)類型都是對(duì)象。但是python的對(duì)象分為不可變對(duì)象和可變對(duì)象。python的變量是引用,對(duì)python變量的賦值是引用去綁定該對(duì)象。
可變對(duì)象的數(shù)據(jù)發(fā)生改變,例如列表和字典,引用不會(huì)更改綁定對(duì)象,畢竟本身就是用于增刪改查的,頻繁地產(chǎn)生新對(duì)象必然導(dǎo)致開銷巨大,只需要該對(duì)象內(nèi)部變化就行;但對(duì)于綁定了不可變對(duì)象的引用,對(duì)象一旦改變就會(huì)使引用綁定新的對(duì)象。
這一點(diǎn)也會(huì)反應(yīng)到函數(shù)的參數(shù)上。python的傳值方式是“傳對(duì)象”引用。python的函數(shù),形參實(shí)際上是引用,實(shí)參便是對(duì)象綁定到該引用上。本質(zhì)是形參會(huì)被作為函數(shù)的局部變量,在開辟的函數(shù)的棧內(nèi)存中被聲明。
簡(jiǎn)要來(lái)講:
如果參數(shù)是數(shù),則類似值傳遞,
如果參數(shù)是列表和字典,則類似引用傳遞。
每個(gè)對(duì)象都會(huì)有個(gè)id, 可以用id()驗(yàn)證以上說(shuō)法:
這個(gè)函數(shù)的參數(shù)是列表,是可變對(duì)象。
python中,所有的元素都是對(duì)象,其中第一類對(duì)象的通用特性:可作為值傳遞,賦值給另一個(gè)對(duì)象;可以作為元素添加到集合對(duì)象中;可以作為參數(shù)傳遞給其他函數(shù);可以作為函數(shù)的返回值