天天看點

PYTHON中的類函數、靜态函數、成員函數以及類變量、成員變量

PYTHON中的類函數、靜态函數、成員函數以及類變量、成員變量

Posted on 2019-03-16 15:10 Mr__Seven 閱讀(14) 評論(0) 編輯 收藏

複制代碼

1 class MethodDemo():

2 classVar = ‘This is a class variable’ #類變量,可在類函數或者成員函數中引用,為所有執行個體共有的

3 def init(self):

4 self.instanceVar = ‘This is a instance variable’ #成員變量,隻可在執行個體對象中引用,隻屬于目前執行個體

5

6 #成員函數

7 def instanceMethod(self,x):

8 temporaryVar = ‘This is a temporary variable’ #臨時變量,隻在目前函數有用,也就是該函數的局部變量

9 print(‘executing instanceMethod(%s,%s)’%(self,x))

10 print(‘classVar = %s’%self.classVar) #類變量可在成員函數中引用

11 print(‘instanceVar = %s’%self.instanceVar) #成員變量可在成員函數中引用

12 print(‘temporaryVar = %s’%temporaryVar) #臨時變量隻能在目前函數中引用

13

14 #類函數

15 @classmethod

16 def classMethod(cls,x):

17 print(‘executing classMethod(%s,%s)’%(cls,x))

18 print(‘classVar = %s’ % cls.classVar) #類方法中能引用類變量

19 # print(‘instanceVar = %s’ % cls.instanceVar) #‘類函數不可引用成員變量 MethodDemo’ has no attribute ‘instanceVar’

20 # print(‘temporaryVar = %s’ % temporaryVar) #類函數不可引用成員函數中的臨時變量 name ‘temporaryVar’ is not defined

21 # print(‘tempVar =%s’ % cls.tempVar) #類函數不可引用成員函數中的局部變量 ‘MethodDemo’ has no attribute ‘tempVar’

22

23 #靜态函數

24 @staticmethod

25 def staticMethod(x):

26 print(‘executing staticMethod(%s)’ % ( x))

27 # print(‘classVar = %s’ % classVar) #靜态函數不可引用類變量

28 # print(‘instanceVar = %s’ % instanceVar) #靜态函數不可引用成員變量

29

30 a = MethodDemo()

31 a.instanceMethod(1) #執行個體對象可引用成員函數

32 a.classMethod(1) #執行個體對象可引用類函數

33 MethodDemo.classMethod(1) #類函數可直接通過類調用

34 a.staticMethod(1) #靜态函數可通過執行個體對象調用

35 MethodDemo.staticMethod(1) #靜态函數可直接通過類調用

36

37 print(a.instanceMethod)

38 print (a.classMethod)

39 print (a.staticMethod)

複制代碼

運作結果:

executing instanceMethod(<main.MethodDemo object at 0x00000000023C0B70>,1)

  classVar = This is a class variable

  instanceVar = This is a instance variable

  temporaryVar = This is a temporary variable

  executing classMethod(<class ‘main.MethodDemo’>,1)

  classVar = This is a class variable

  executing classMethod(<class ‘main.MethodDemo’>,1)

  classVar = This is a class variable

  executing staticMethod(1)

  executing staticMethod(1)

  <bound method MethodDemo.instanceMethod of <main.MethodDemo object at 0x00000000023C0B70>>

  <bound method MethodDemo.classMethod of <class ‘main.MethodDemo’>>

  <function MethodDemo.staticMethod at 0x00000000024DE048>

由此可看出,python中的變量主要包括:類變量、成員變量以及臨時(局部)變量。其中類變量可以在類函數、成員函數中直接使用,可以通過類名或者執行個體對象直接調用。成員變量隻可以在成員函數中使用,并且隻能通過執行個體對象調用。而函數内部定義的臨時變量隻能在目前函數中使用。

至于類函數、靜态函數、成員函數之間的差別如下:

類函數,通過裝飾器@classmethod注解的函數為類函數,有一個隐含參數cls是該類本身。顧名思義,為這個類擁有的函數,可以直接通過類名直接調用,無需執行個體化對象,也可以通過該類的執行個體對象調用。

靜态函數,通過裝飾器@staticmethod注解的函數為靜态函數,可以通過類名直接調用,也可以通過該類的執行個體化對象調用。其實靜态方法隻是在類的作用域裡的函數而已,一般主要處理與這個類的邏輯關聯, 如驗證資料。

成員函數,有一個隐含參數self是目前執行個體本身。隻能被該類的執行個體對象調用。