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