日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python方法定义..._解析Python类中的方法定义

發布時間:2024/9/27 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python方法定义..._解析Python类中的方法定义 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在學習類過程中,綁定方法這個概念沒有理解透徹,所以在網上找了很多相關博客、文章研究到底是怎么一回事。因為有的文章所陳述與我在python3.5版本實際實驗中有些出入,所以經過實踐后總結出以下結論。

對于Python類中,方法的定義方式,我們可以歸納有4種類型:

1、不帶self、cls參數且不加裝飾器(staticmethod、classmethod)2、正常的方法定義,帶self參數3、類方法:加裝飾器(classmethod)4、靜態方法:加裝飾器(staticmethod)

下面對每一種定義的方式進行分析:

1、不帶self、cls參數且不加裝飾器(staticmethod、classmethod)

定義代碼如下:

class Student(object):def func(name):print('my name is {}'.format(name))

我們通過用類和實例分別調用該方法:

print(Student.func) Student.func('Tom') print(Student().func) Student().func('Tom')

類調用output:

<function Student.func at 0x0000000000D7D268> my name is Tom [Finished in 0.1s]

實例調用output:

<bound method Student.func of <__main__.Student object at 0x0000000000D444A8>> Traceback (most recent call last):File "I:MyProjectawesome-python3-webappwwwfor_test.py", line 11, in <module>Student().func('Tom') TypeError: func() takes 1 positional argument but 2 were given [Finished in 0.2s with exit code 1]

從上面的輸出我們可以看出,此種定義方法,如果用類來調用該方法,那么這個方法就只是一個函數,不會像綁定方法一樣會自動傳值。傳參只需按照正常的函數傳參即可;如果用實例來調用該方法,那么這個方法就是綁定(bound)的方法,既然是綁定方法,那么就會自動把Student()自身作為第一個參數傳到方法中去,所以Student().func('Tom')會傳實例Student()以及'Tom'兩個參數到此方法,但是由于此方法定義時只定義了一個參數,所以就會有上述的報錯。

2、正常的方法定義,帶self參數

定義代碼如下:

class Student(object):def func(self, name):print('my name is {}'.format(name))

類調用該方法:

print(Student.func) Student.func('Tom')

output:

<function Student.func at 0x000000000070D268> Traceback (most recent call last):File "I:MyProjectawesome-python3-webappwwwfor_test.py", line 8, in <module>Student.func('Tom') TypeError: func() missing 1 required positional argument: 'name' [Finished in 0.2s with exit code 1]

用類調用該方法,跟第一種情況一樣,依然是一個函數。因為此函數有兩參數(self和name),由于實參'Tom'是傳到了形參self,所以輸出中提示調用func方法少了name參數。正確的調用方式為Student.func(Student(), 'Tom')。

用實例調用該方法:

print(Student().func) Student().func('Tom')

output:

<bound method Student.func of <__main__.Student object at 0x00000000006E44A8>> my name is Tom [Finished in 0.2s]

可以看出實例調用該方法,得到是綁定的方法,Student()和Tom參數,分別傳給形參self和name。

其實第一種和第二種定義的方法是一樣的,而他們的區別只是有沒有self這個參數。只要是實例調用這個方法,都是綁定的方法。都會自動將實例自身作為第一個參數傳遞進去。self這個參數,是大家約定俗成的一種參數命名,命名成a或者b都是可以的,只不過這樣命名會降低代碼的可讀性。下面要說的類方法中的cls參數也是這個道理。

3、類方法:加裝飾器(classmethod)

定義代碼如下:

class Student(object):@classmethoddef func(cls, name):print('my name is {} from {}'.format(name, cls.__name__))

用類和實例分別調用該方法:

print(Student.func) Student.func('Tom') print(Student().func) Student().func('Tom')

output:

<bound method Student.func of <class '__main__.Student'>> my name is Tom from Student <bound method Student.func of <class '__main__.Student'>> my name is Tom from Student [Finished in 0.2s]

可以看出,此種定義方式,用類或者實例調用,都是綁定的方法。用類調用,會將類自身作為第一個參數傳遞到方法中。用實例調用,會將實例所屬的類作為第一個參數傳遞到方法中。

4、靜態方法:加裝飾器(staticmethod)

定義代碼如下:

class Student(object):@staticmethoddef func(name):print('my name is {}'.format(name))

用類和實例分別調用該方法:

print(Student.func) Student.func('Tom') print(Student().func) Student().func('Tom')

output:

<function Student.func at 0x0000000000D6D268> my name is Tom <function Student.func at 0x0000000000D6D268> my name is Tom [Finished in 0.2s]

從上面的輸出代碼中,可以看出,使用裝飾器staticmethod裝飾的函數,只是一個普通函數,沒有綁定方法的自動傳值功能,傳參只需按照正常的函數傳參即可。

綜合上面分析,我們可以總結如下:

1、凡是類中的方法、函數,如果沒有加裝飾器,當通過類來調用的時候,得到的是普通的函數,當通過實例來調用的時候,得到的是綁定方法;
2、加裝飾器classmethod的方法,無論是通過類或者實例來調用,得到的都是綁定方法,python會自動將類本身或者實例所屬的類作為第一個參數傳遞進去;
3、加裝飾器staticmethod的方法,通過類或者實例調用,得到的都是普通函數。

總結

以上是生活随笔為你收集整理的python方法定义..._解析Python类中的方法定义的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。