Python中的实例变量、类变量、普通函数、类函数、静态函数的区别
Python3下进行测试,2也通用,print的形式变一下即可。
# 参考源码
class A(object):
class_val = '0' # 类变量
def __init__(self, x):
self.member_val = x # 实例变量
print(self.member_val)
def foo(self): # ①普通函数
print('foo call: %s' % self.member_val)
@classmethod
def class_foo(cls): # ②类函数
print('class_foo call: %s' % cls.class_val)
#print('class_foo call: %s' % member_val) #类方法不能访问实例变量 ③
pass
@staticmethod
def static_foo(x): # ④静态函数
print("static_foo call: %s" % x)
# 演示调用
a = A(1) # 对照源码,会打印一行1
a.foo() # 类实例调用普通方法会自动分配self,不需要显式传递
A.foo(a) # 类调用普通函数,可以显式传递self引用
a.class_foo() # 类实例调用类方法,实际上执行时会忽略对象调用,进而转换为类调用,即下一行的形式
A.class_foo() # 类调用类方法
a.static_foo(2) # 实例调用静态函数
A.static_foo(2) # 类调用静态函数
# 对应输出
1
foo call: 1
foo call: 1
class_foo call: 0
class_foo call: 0
static_foo call: 2
static_foo call: 2
# 代码形式区别
对照源码的①②③④
①普通函数编写时要有self作为第一参数,否则编译报错。
②类函数编写时要保留cls作为第一参数,否则运行时报错。
③类方法不能访问实例变量
④静态函数可提供类名静态调用,无特殊限制。
# 意义区别及适用场景
普通函数:方法依赖于对象(类实例)的存在为前提,没有对象则普通函数没有意义。
类函数:针对特定类进行操作的函数,在运行方式上与静态函数几乎一致(仅多了一个类引用变量cls)。适用于类的初始化调用。
静态函数:适用于工具类函数等通用,且无需依赖具体对象出现的功能封装。例如math.ceil,计算向上整数去新建一个对象没有意义。