一、類方法
在類中的函數稱為類方法。與普通函數定義稍有區別。
1.普通方法
1.1 普通方法定義
普通方法與一般函數的定義稍有區別的點在于第一個參數是self,,指代的意思是指向實例對象本身。如下圖定義
1
2
3
4
5
|
class Person: def __init__( self ,name,age): # name=對象的那個name,age=對象的那個age self .name = name self .age = age |
1.2 普通方法調用
思考一下函數的調用是函數名(),類的方法調用呢?
類方法調用必須要借助對象。調用方式:對象.方法名()。
不能直接用類名.方法名(),前面已經說過了類中的方法第一個參數是self,代表的是實例對象本身,所以類是不能直接調用普通方法的
1
2
3
4
|
#實例化對象cat cat = Animals() #調用類中普通方法run cat.run() |
如果使用類名.方法名的時候會出現:TypeError: run() missing 1 required positional argument: 'self',遺失一個參數。
但實際上我們再使用對象.方法名()的時候也沒有帶self,卻沒有報遺失一個參數。
原因:當我們實例化對象的時候,即cat=Animal()執行的時候已經將cat的地址傳給self,此時self指代的是cat.
2.魔術方法
2.1 魔術方法定義
前面普通方法是需要對象名.方法名()去調用,而我們的魔術方法比較特殊,他是在特殊時刻自動觸發,即不需要調用。
2.2 常見魔術方法
__init__(self,[參數名]) | 對象創建時自動調用的方法 |
__str__(self,[參數名]) | 函數有返回值,當打印對象名的時候自動調用 |
__del__(self) | 當刪除引用時自動調用 |
__call__(elf,[參數名]) | 當執行對象名()時自動調用即把對象當成函數使用 |
看上圖我們只是創建了cat對象,并沒有調用__init__方法,但是卻執行了方法里面的方法體,是因為在創建對象時python自動觸發了。
__init__方法有什么作用:
定義一個類時,常常要定義屬性和方法,屬性是類的一個特征,而方法是它能做的事情。
所有的人都有名字和年齡,所以我們要定義一個Person類,擁有兩個屬性名字和年齡
如果在類里寫如下圖
1
2
3
4
5
6
7
|
class Person(): name = 'jimi' age = 12 def run( self ): print ( 'run' ) person1 = Person() person2 = Person() |
那么person1和person2對象擁有了Person的屬性,但是此刻他倆的屬性一樣,可是并不符合每個人的特征啊?每個人的名字和年齡不一致的。那怎么樣才能創造出對象不一樣的屬性值,這里就用__init__
1
2
3
4
5
6
7
8
9
10
11
12
|
class Person: def __init__( self ,name,age): # name=對象的那個name,age=對象的那個age self .name = name self .age = age person1 = Person( 'meimei' , 12 ) # 打印person1的屬性 meimei 12 print (person1.name,person1.age) person2 = Person( 'john' , 13 ) # # 打印person1的屬性 john 13 print (person2.name,person2.age) |
__str__是用來打印對象時返回一個值,所以__str__是有return 語句的。如果不用__str__打印對象,對象就是一個地址
1
2
3
4
5
6
7
8
9
10
|
class Person: def __init__( self ,name,age): # name=對象的那個name,age=對象的那個age self .name = name self .age = age # def __str__(self): # return '這是name:{},這是age:{}'.format(self.name,self.age) person1 = Person( 'meimei' , 12 ) #打印結果<__main__.Person object at 0x0000025C1F932C50> print (person1) |
3.類方法
3.1 類方法定義
1
2
3
4
5
6
7
8
9
10
11
|
class Person: def __init__( self ,name,age): # name=對象的那個name,age=對象的那個age self .name = name self .age = age # def __str__(self,*krg,**krgs): # return '這是name:{},這是age:{}'.format(self.name,self.age) #類方法 @classmethod def test1( cls ): print ( '我是類方法' ) |
方法前用裝飾器@classmethod修飾。第一個參數為cls代表類
類方法特點:類方法里面不能調用普通方法
3.2 類方法調用
- 對象名.方法名()
- 類名.方法名()
4.靜態方法
4.1 靜態方法定義
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Person: def __init__( self ,name,age): # name=對象的那個name,age=對象的那個age self .name = name self .age = age # def __str__(self): # return '這是name:{},這是age:{}'.format(self.name,self.age) def run( self ): Person.test1() Person.test() print ( '我是run' ) @classmethod def test1( cls ): print ( '我是類方法' ) @staticmethod def test( * krgs): Person.test1() print ( '我是靜態方法' ) |
靜態方法用裝飾器@staticmethod修飾,無cls,self參數
4.2 靜態方法調用
對象名.靜態方法名()
類名.靜態方法名()
二 總結
普通方法中:
- 可調用普通方法,使用self.方法名()
- 可調用靜態方法,使用類名.方法名()
- 可調用類方法,使用類名.類名.方法名()
靜態方法:
- 不可調用普通方法
- 可調用類方法,類名.方法名()
- 可調用靜態方法,類名.方法名()
類方法:
- 不可調用普通方法
- 可調用類方法,類名.方法名()
- 可調用靜態方法,類名.方法名()
到此這篇關于Python類方法總結講解的文章就介紹到這了,更多相關Python類方法總結內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/weixin_41326473/article/details/119027153