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类中的方法定义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu mysql5.6_ubun
- 下一篇: websocket python爬虫_p