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是当前实例本身。只能被该类的实例对象调用。