python中staticmethod和classmethod

python 中staticmethod和classmethod

@staticmethod和@classmethod是python中的两个装饰器(装饰器理解请见:python装饰器)。

@staticmethod将函数转换成为一个静态方法,@classmethod将函数转换成为一个类方法。

使用方法

# coding=utf-8
class Function(object):

    # Instance method
    def add(self, n1, n2):
        print("add : {} + {} = {}".format(n1, n2, n1 + n2))

    @classmethod
    def minus(cls, n1, n2):
        print("minus : {} - {} = {}".format(n1, n2, n1 - n2))

    @staticmethod
    def multiply(n1, n2):
        print("multiply : {} - {} = {}".format(n1, n2, n1 * n2))


if __name__ == '__main__':
    f = Function()
    f.add(3, 2)  # 输出:add : 3 + 2 = 5
    f.minus(3, 2)  # 输出:minus : 3 - 2 = 1
    Function().minus(3, 2)  # 输出:minus : 3 - 2 = 1
    Function().multiply(3, 2)  # 输出:multiply : 3 - 2 = 6
    f.multiply(3, 2)  # 输出 : multiply : 3 - 2 = 6

区别

实例方法类方法(classmethod)静态方法(staticmethod)
定义方式self作为第一个参数cls作为第一个参数无强制参数
绑定对象类的实例
调用方式只能通过类的实例调用类对象或类的实例均可调用类对象或类的实例均可调用

特点

@staticmethod

  • 用法与类外函数很像,函数属于类,但是使用的时候不需要访问它所属的类。
  • 可以被用来组织类之间有逻辑关系的函数。在很多情况下,一些函数与类相关,但不需要任何类或实例变量就可以实现一些功能。比如设置环境变量,修改另一个类的属性等等。假如我们想仅实现类之间的交互而不是通过实例,我们可以在类之外建立一个简单的函数来实现这个功能,但是这会使代码扩散到类之外,可能对未来代码维护产生问题。

@classmethod

  • 实例属性由实例更改,不会影响类属性。而类属性则可以由类方法 (classmethod) 来更改。
  • 持有cls参数,可以调用类的属性,类的方法等,避免了使用类名硬编码。

参考博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值