Python之方法呼叫

2021-08-19 13:35:24 字數 4130 閱讀 4342

python中類的方法有兩種形式:

繫結的概念主要與方法呼叫相關聯,方法是類內部定義的函式(這意味著方法是類屬性而不是例項屬性),方法只有在其所屬的類擁有例項時,才能被呼叫,當存在乙個例項時,方法才被認為是繫結到那個例項了。任何乙個方法定義中的第乙個引數都是self變數,表示呼叫此方法的例項物件。

class person():

def __init__(self,name,age):

self.name = name

self.age = age

def talk(self):

print "talk calling"

p = person('rhx',25)

print p.talk

>
注意這裡不是呼叫的p.talk(),對於另一種情況,定義的talk()函式中沒有self變數

class person():

def __init__(self,name,age):

self.name = name

self.age = age

def talk():

print "talk calling"

p = person('rhx',25)

print p.talk

>
發現無論talk中是否帶有self,例項化物件 p 均可以呼叫。這也說明了不管是類中的方法,還是類中定義的函式,預設情況下都是繫結給物件使用的,在例項中呼叫乙個繫結的方法時,不需要手動的傳入引數了。

class person():

def __init__(self,name,age):

self.name = name

self.age = age

def talk():

print "talk calling"

p = person('rhx',25)

print person.talk

print p.talk

#使用類名進行呼叫,為非繫結的方法

> #使用例項化物件進行呼叫為繫結的方法

對於在talk中帶有self變數的情形

class person():

def __init__(self,name,age):

self.name = name

self.age = age

def talk(self):

print "talk calling"

p = person('rhx',25)

print person.talk()

print p.talk()

typeerror: unbound method talk() must be called with person instance as first argument (got nothing instead)
結果表明talk()呼叫時必須傳入類的例項化物件,當類呼叫類中的方法時候,是不會進行自動傳值的,也就是說,函式有幾個引數,就得傳遞進去幾個引數。如果想結果正常執行,那麼在類名呼叫talk()的時候,將引數一一都傳遞進去。即:

print person.talk(p)
class person():

def __init__(self,name,age):

self.name = name

self.age = age

def talk():

print "talk calling"

p = person('rhx',25)

print person.talk

print p.talk()

print p.talk()

typeerror: talk() takes no arguments (1 given)

從輸出結果來看,person來呼叫talk()方法時候,並不需要傳遞引數;而當物件來呼叫talk()的時候,由於物件呼叫自己的繫結方法,會自動將例項化物件當作第乙個引數傳遞進去,所以,當類中talk()方法沒有帶引數時,而你又給它傳遞了乙個,顯然是會報錯的。

綜上所述,我們可以得出以下結論: 

1.凡是類中的方法和函式,都是繫結給物件使用的;

2.繫結方法都有自動傳值的功能。傳遞進去的值,就是物件本身。

3.如果類想呼叫繫結方法,就必須遵循函式的引數規則,有幾個引數,就必須傳遞幾個引數。

既然類中的方法都是繫結給物件使用的,那麼有沒有方法是繫結給類使用的呢?

既然類中的方法,預設都是繫結給物件使用,那麼,我們要採取一點措施,將類中的繫結方法解除物件繫結關係,進而繫結到類上,通常的方法需要乙個例項self作為第乙個引數,並且對於(繫結的)方法呼叫來說,self時自動傳遞給這個方法的,而對於類方法而言,需要類而不是例項作為第乙個引數,它是由直譯器傳給方法。

在python中,引入了@classmethod方法,將類中的方法繫結到類身上。

class person():

def __init__(self,name,age):

self.name = name

self.age = age

@classmethod #talk = classmethod(talk)

def talk(cls): #cls即為類自身

print "talk calling"

p = person('rhx',25)

print person.talk()

print p.talk()

這裡之所以例項化物件呼叫類方法也可行的原因就是類方法也有乙個引數cls,例項化物件呼叫的時候將例項化物件self傳遞給形參cls。類中方法預設都是繫結給物件使用,當物件呼叫繫結方法時,會自動將物件作為第乙個引數傳遞進去;而類來呼叫,則必須遵循函式引數一一對應的規則,有幾個引數,就必須傳遞幾個引數。如果乙個方法是用了@classmethod裝飾器,那麼這個方法繫結到類身上,不管是物件來呼叫還是類呼叫,都會將類作為第乙個引數傳遞進去。

在前面的例子中,對於沒有引數的talk,使用類呼叫的時候是

class person():

def __init__(self,name,age):

self.name = name

self.age = age

def talk():

print "talk calling"

p = person('rhx',25)

print person.talk()

print p.talk()

print person.talk()

typeerror: unbound method talk() must be called with person instance as first argument (got nothing instead)

但是傳遞乙個例項化物件p的時候

print person.talk(p)
仍然會有問題,因為方法talk本來就沒有引數

print person.talk(p)

typeerror: talk() takes no arguments (1 given)

這個時候需要靜態方法

class person():

def __init__(self,name,age):

self.name = name

self.age = age

@staticmethod #talk = staticmethod(talk)

def talk(): #不能傳遞類或例項相關引數,如cls或者self,但是可以傳遞其它引數

print "talk calling"

p = person('rhx',25)

print person.talk()

print p.talk()

Python呼叫父類方法之super()

super 方法的語法 super type object or type super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序 mro 重複呼叫 鑽石繼承 等種種問題。在super方法中包含了cj演算法 確保每個類被呼叫一次 具...

python學習之魔法方法的呼叫

在python中存在一些前面和後邊都加上兩個下劃線的函式,這種函式會在一些特殊的情況下被呼叫,而不是根據他們的名字被呼叫。下面詳細介紹幾個重要的函式.init 函式,這類進行初始化的函式,在建立乙個具體的物件的時候會自動的呼叫。class people def init self self.univ...

python呼叫dll方法

在python中呼叫dll檔案中的介面比較簡單,例項 如下 如我們有乙個test.dll檔案,內部定義如下 extern c 在python中我們可以用以下兩種方式載入1.import ctypes dll ctypes.windll.loadlibrary test.dll 2.import ct...