方法是類或者對象行爲特徵的抽象,方法其實也是函數,它的定義方式、調用方式與函數都很類似。python
先來看一段代碼:app
# 定義全局空間test函數 def test(): print ('全局空間test方法') # 定義全局空間num變量 num = 1 # 定義Test01類 class Test01: # 定義Test01空間內的test02函數 def test02(): print ('Test01空間的test02方法') # 定義Test01空間內的num變量 num = 2 #調用全局函數test() test() # 打印 全局空間test方法 # 調用 Test01空間的函數test02() Test01.test02() # Test01空間的test02方法 #調用全局變量num print (num) # 打印 1 # 調用Test01空間的變量num print (Test01.num) # 打印 2
上面代碼中,能夠看出全局空間內定義的函數和在Test01類中定義的函數沒有多大區別,在調用Test01類中的函數和變量,只須要類名.變量名或者類名.函數名就能夠了,這就是類調用實例。函數
值得注意的是,使用類名.函數名訪問的是函數,使用實例.函數名訪問的是方法。ui
例:對象
A = Test01() from types import FunctionType,MethodType # 經過實例訪問的是方法 print (isinstance(A.test02,MethodType)) # 打印 True # 經過類訪問的是函數 print (isinstance(Test01.test02,FunctionType)) # 打印 True
若是使用類調用實例方法,第一個參數不會自動綁定,只能手動去爲第一個參數綁定參數值。blog
例:字符串
class Tree: def apple_tree(self): print ('這是一棵樹',self) # 直接使用類名.函數名調用,因爲第一個參數不會自動綁定,會報錯 TypeError: apple_tree() missing 1 required positional argument: 'self' Tree.apple_tree() T = Tree() # 爲第一個參數綁定參數值 Tree.apple_tree(T) # 打印 這是一棵樹 <__main__.Tree object at 0x0000000002E335F8> # 第一個參數綁定的參數值不必定要綁定該Tree類的對象T,例如綁定字符串 Tree.apple_tree('雪梨樹') # 打印 這是一棵樹 雪梨樹
使用@classmethod裝飾的方法是類方法,python會自動綁定類方法的第一個參數到類自己(參數名一般是cls),能夠經過他來傳遞類的屬性和方法,但不能傳遞實例的屬性和方法;使用@staticmethod裝飾的方法是靜態方法,靜態方法不會自動綁定第一個參數到類自己,且靜態方法沒有‘self’和‘cls’參數,方法中不能使用類或實體的任何屬性和方法。it
類方法,例:io
class a: a1 = 0 def c(): print ('a類的c方法') @classmethod def b(cls): cls.c() print (cls.a1) # 經過類調用,自動綁定類方法的第一個參數,不須要手動去綁定 a.b() ''' 打印 a類的c方法 0 ''' # 經過實例對象調用 A = a() A.b() ''' 打印 a類的c方法 0 '''
靜態方法,例:class
class a: @staticmethod def b(): print ('b()是靜態方法') # 經過類調用 a.b() # 打印 b()是靜態方法 # 經過實例對象調用 A = a() A.b() # 打印 b()是靜態方法