Python的类成员函数、静态函数和成员的函数的比较

从声明方式来看:
普通成员函数是最一般的方法,即

class Foo:
    def plain_func():
    	pass

类成员函数是

class Foo:
	@classmethod
	def class_func():
		pass

静态函数是

class Foo:
	@staticmethod
	def static_func():
		pass

从调用方式来看,普通函数与后两者区别较大,普通函数只能在类的实例中被调用,而后两者可以通过类名进行调用:

class Foo:
    def plain_func(self):
        print("plain_func")

    @classmethod
    def class_func(cls):
        print("class_func")

    @staticmethod
    def static_func():
        print("static_func")


# 必须实例化进行调用
foo = Foo()
foo.plain_func()
# 通过类名进行调用
Foo.class_func()
Foo.static_func()

而后类方法和静态的方法最核心的区别就在于类方法有cls参数,而静态方法没有cls参数。cls可以理解为this指针,它引用了一个类实例。

来自知乎这个回答关于类方法的总结:

  • 方法可以判断出自己是通过基类被调用,还是通过某个子类被调用
  • 通过子类调用时,方法可以返回子类的实例而非基类的实例
  • 通过子类调用时,方法可以调用子类的其他classmethod

一般来说classmethod可以完全替代staticmethod。staticmethod唯一的好处是调用时它返回的是一个真正的函数,而且每次调用时返回同一个实例(classmethod则会对基类和子类返回不同的bound method实例),但这点几乎从来没有什么时候是有用的。不过,staticmethod可以在子类上被重写为classmethod,反之亦然,因此也没有必要提前将staticmethod全部改为classmethod,按需要使用即可。

作者:灵剑
链接:https://www.zhihu.com/question/20021164/answer/537385841
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值