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,计算向上整数去新建一个对象没有意义。

posted @ 2018-07-12 16:18  DXCyber409  阅读(91)  评论(0编辑  收藏  举报