def本身是一個(gè)函數(shù)對(duì)象。也可以叫它“方法”。屬于對(duì)象的函數(shù),就是對(duì)象的屬性。def定義了一個(gè)模塊的變量,或者說(shuō)是類(lèi)的變量。
創(chuàng)新互聯(lián)技術(shù)團(tuán)隊(duì)十載來(lái)致力于為客戶(hù)提供成都網(wǎng)站制作、網(wǎng)站建設(shè)、成都品牌網(wǎng)站建設(shè)、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過(guò)多年發(fā)展,公司擁有經(jīng)驗(yàn)豐富的技術(shù)團(tuán)隊(duì),先后服務(wù)、推廣了近1000家網(wǎng)站,包括各類(lèi)中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。
python
的函數(shù)和其他語(yǔ)言的函數(shù)有很大區(qū)別。它是可以被其他變量覆蓋的,如:
在Python中,對(duì)這兩個(gè)東西有明確的規(guī)定:
函數(shù)function —— A series of statements which returns some value to a caller. It can also be passed zero or more arguments which may be used in the execution of the body.
方法method —— A function which is defined inside a class body. If called as an attribute of an instance of that class, the method will get the instance object as its first argument (which is usually called self).
從定義的角度上看,我們知道函數(shù)(function)就相當(dāng)于一個(gè)數(shù)學(xué)公式,它理論上不與其它東西關(guān)系,它只需要相關(guān)的參數(shù)就可以。所以普通的在module中定義的稱(chēng)謂函數(shù)是很有道理的。
那么方法的意思就很明確了,它是與某個(gè)對(duì)象相互關(guān)聯(lián)的,也就是說(shuō)它的實(shí)現(xiàn)與某個(gè)對(duì)象有關(guān)聯(lián)關(guān)系。這就是方法。雖然它的定義方式和函數(shù)是一樣的。也就是說(shuō),在Class定義的函數(shù)就是方法。
從上面的角度看似乎很有道理。
def fun():
pass
type(fun)
class 'function' #沒(méi)有問(wèn)題
class Cla():
def fun():
pass
@classmethod
def fun1(cls):
pass
@staticmethod
def fun2():
pass
i=Cla()
Cla.fun.__class__
class 'function' #為什么還是函數(shù)
i.fun.__class__ #這個(gè)還像話(huà)
class 'method'
type(Cla.fun1)
class 'method' #這里又是方法
type(i.fun1)
class 'method'#這里仍然是方法
type(Cla.fun2)
class 'function' #這里卻是函數(shù)
type(i.fun2)
class 'function'#這里卻是函數(shù)
事實(shí)上,上面的結(jié)果是可以解釋的:
1,普通方法(老版中直接就是"instancemethod")在module中與在Class中定義的普通函數(shù),從其本身而言是沒(méi)有什么區(qū)別的,他們都是對(duì)象函數(shù)屬性。 之所以會(huì)被說(shuō)在Class中的定義的函數(shù)被稱(chēng)為方法,是因?yàn)樗緛?lái)就是面向?qū)?lái)的實(shí)例對(duì)象的,其實(shí)他們就是實(shí)例方法,這些方法是與實(shí)例相聯(lián)系的(從實(shí)例出發(fā)訪(fǎng)問(wèn)該函數(shù)會(huì)自動(dòng)賦值)。所以你從Class訪(fǎng)問(wèn)仍然是一個(gè)函數(shù)
2,類(lèi)方法("classmethod"),因?yàn)轭?lèi)同樣是對(duì)象,所以如果函數(shù)與類(lèi)進(jìn)行聯(lián)系了話(huà)(與實(shí)例方法一樣的模式)那么就能夠這么說(shuō)了!
3,靜態(tài)方法,雖然定義在內(nèi)部,并且也較方法,但是卻不與任何對(duì)象聯(lián)系,與從類(lèi)訪(fǎng)問(wèn)方法是一樣的,他們?nèi)匀皇呛瘮?shù)。
這樣看來(lái)上面的定義可以改改了:
函數(shù)的定義自然不變。
方法的定義可以是這樣的,與某個(gè)對(duì)象進(jìn)行綁定使用的函數(shù)。注意哦。綁定不是指" . "這個(gè)符號(hào),這個(gè)符號(hào)說(shuō)實(shí)在的只有域名的作用。綁定在這里是指,會(huì)默認(rèn)賦值該綁定的對(duì)象。
在Python里,函數(shù)在很多時(shí)候就叫方法,比如在類(lèi)里面定義函數(shù),其實(shí)就是類(lèi)的方法。 還有自定義函數(shù),其實(shí)也可以稱(chēng)做自定義方法。 不用太在意稱(chēng)呼,沒(méi)什么區(qū)別,你知道別人說(shuō)方法其實(shí)就是函數(shù)就行。反之亦然Python 里面的 函數(shù) 和 方法 怎么區(qū)分
定義一個(gè)函數(shù)就是定義一個(gè)方法,self是自身,調(diào)用的時(shí)候如果需要傳入魔法方法__init__(初始定義的值【也就是參數(shù)】)時(shí)就需要帶self,不需要?jiǎng)t可以在函數(shù)(即方法)前加修飾@staticmethod,就不用帶self參數(shù)了。
python使用對(duì)象模型來(lái)存儲(chǔ)數(shù)據(jù),也就是說(shuō)構(gòu)造任何類(lèi)型的值都是一個(gè)對(duì)象。所有的python對(duì)象都擁有三個(gè)特性:身份id,類(lèi)型和值。
身份id:唯一的身份標(biāo)識(shí),可以使用內(nèi)建函數(shù)id()來(lái)得到,這個(gè)值可以被認(rèn)為是該對(duì)象的內(nèi)存地址。
類(lèi)型:對(duì)象的類(lèi)型決定了該對(duì)象可以保存什么類(lèi)型的值,可以進(jìn)行什么樣的操作,以及遵循什么樣的規(guī)則,可以用內(nèi)建函數(shù)type()查看
python對(duì)象的類(lèi)型,也可以用isinstance(),在python中類(lèi)型也是對(duì)象。
值:對(duì)象表示的數(shù)據(jù)項(xiàng)。布爾邏輯運(yùn)算符包括and、or、not,對(duì)象值的比較除了一些常見(jiàn)的運(yùn)算符( = = == !=)之外,還可以
使用cmp()內(nèi)建函數(shù),如果是用戶(hù)自定義對(duì)象,cmp()對(duì)調(diào)用該類(lèi)的特殊方法__cmp__()。對(duì)于字符串來(lái)說(shuō),內(nèi)建函數(shù)str(obj)返回對(duì)象適
合可讀性好的字符串表示,而另一個(gè)內(nèi)建函數(shù)repr(obj)返回一個(gè)對(duì)象的字符串表示,通常情況下obj == eval(repr(obj))這個(gè)等式是成立
的??梢赃@么說(shuō),repr()的輸出對(duì)python比較友好,str()的輸出對(duì)人比較友好。方法是在類(lèi)中定義的函數(shù)。
更多技術(shù)請(qǐng)關(guān)注Python視頻教程。
類(lèi),class,用來(lái)描述具有相同的屬性和方法的對(duì)象的集合。它定義了該集合中每個(gè)對(duì)象所共有的屬性和方法。對(duì)象是類(lèi)的實(shí)例。
函數(shù),是組織好的,可重復(fù)使用的,用來(lái)實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。
函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。你已經(jīng)知道python提供了許多內(nèi)建函數(shù),比如print()。但你也可以自己創(chuàng)建函數(shù),這被叫作用戶(hù)自定義函數(shù)。
python語(yǔ)言中類(lèi)和函數(shù)的區(qū)別
1、規(guī)則不同
類(lèi)是一種引用數(shù)據(jù)類(lèi)型,類(lèi)似于byte、short、int(char)、long、float、double等基本數(shù)據(jù)類(lèi)型;
函數(shù)必須聲明后才可以被調(diào)用,調(diào)用格式為:函數(shù)名(實(shí)參)調(diào)用時(shí)函數(shù)名后的小括號(hào)中的實(shí)參必須和聲明函數(shù)時(shí)的函數(shù)括號(hào)中的形參個(gè)數(shù)相同。
2、主體不同
類(lèi)是面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)現(xiàn)信息封裝的基礎(chǔ);
函數(shù)是指一段在一起的、可以做某一件事的子程序。
3、特點(diǎn)不同
類(lèi)是一種用戶(hù)定義的引用數(shù)據(jù)類(lèi)型,也稱(chēng)類(lèi)類(lèi)型,每個(gè)類(lèi)包含數(shù)據(jù)說(shuō)明和一組操作數(shù)據(jù)或者傳遞消息的函數(shù),類(lèi)的實(shí)例稱(chēng)為對(duì)象;
函數(shù)分為全局函數(shù)、全局靜態(tài)函數(shù),在類(lèi)中還可以定義構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、成員函數(shù)、友元函數(shù)、運(yùn)算符重載函數(shù)、內(nèi)聯(lián)函數(shù)等。