python的 @staticmethod 和 @classmethod 区别

python的 @staticmethod 和 @classmethod 区别

一、总结:

一个比较简单粗暴的区分方式:

要决定是使用 @staticmethod 还是 @classmethod,你必须看看类方法内部。如果你的方法访问了类中的其他变量/方法,那么就使用 @classmethod。另一方面,如果方法没有接触到类中的任何其他变量,那么就使用 @staticmethod。

其设计有更深的逻辑联系:

classmethod:主要用于替代构造函数。

staticmethod:不使用对象的状态,甚至不使用类本身的结构。它可以是一个类外部的函数。它只放在类的内部,用于分组具有类似功能的函数(例如,像Java的数学类静态方法)。

示例代码:

@classmethod 
Person.printAge = classmethod(Person.printAge)

@staticmethod 
Calculator.add_numbers = staticmethod(Calculator.add_numbers)

能看懂这两行代码,应该就能理解什么是静态方法,什么是类方法了吧。

当然,看的不太懂也没有关系,下面通过栗子来详细的解说一下。

二、

类方法 @classmethod

什么是类方法?

类方法是绑定到类而不是其对象的方法。它不需要创建类实例,就像 @staticmethod 一样。

三、

静态方法 @staticmethod

一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。

而使用 @staticmethod 或 @classmethod,就可以不需要实例化,直接类名.方法名()来调用。

python @staticmethod 返回函数的静态方法。

该方法不强制要求传递参数,

声明一个静态方法:

class C(object):
    @staticmethod
    def f(arg1, arg2, ...):
        ...

可以不实例化调用该方法 C.f()

实现实例化使用 C().f()

什么时候使用@staticmethod:

当某个方法(函数)【不需要用到对象中的任何资源】,将这个方法改为一个静态方法,

加上@staticmethod;

这个函数的形参不需要添加 self;

加上之后, 这个方法就和普通的函数没有什么区别了, 只不过写在了一个类中, 可以使用这个类的对象调用,也可以使用类直接调用。

四、

静态方法和类方法之间的区别在于:

静态方法对类一无所知,只处理参数。

类方法适用于类,因为它的参数始终是类本身。

类方法可以由类及其对象调用。

Class.classmethod()
Class().classmethod()

但无论如何,class方法始终附加到一个类,其中第一个参数作为类本身。cls。

def classMethod(cls, args…)

五、

例子:

class Person:
    age = 25
    def printAge(cls):
        print('The age is:', cls.age)
Person.printAge = classmethod(Person.printAge)

Person.printAge()

代码2:

class Person:
    age = 25
    @classmethod
    def printAge(cls):
        print('The age is:', cls.age)

Person.printAge()

六、

注意:

你会发现改变了代码,但是结果还是一样的。你细心就会有所发现,没错,代码中的:

****

@classmethod 等价于 Person.printAge = classmethod(Person.printAge)

实例方法可以调用【实例方法】、【类方法】、【静态方法】。

类对象只能调用【类方法】、【静态方法】。

@classmethod 与 @staticmethod 用法类似,@classmethod 可以通过 @staticmethod代替,在通过类调用时,这两者对于调用者来说是不可区分的。这两者的区别在于,@classmethod增加了一个对实际调用类的引用。

1.方法可以判断出自己是通过基类被调用,还是通过某个子类被调用

2.通过子类调用时,方法可以返回子类的实例而非基类的实例

3.通过子类调用时,方法可以调用子类的其他 @classmethod

#############################################################################

鸣谢:特别感谢所有在CSDN等网站热爱技术、乐于分享的工程师们。

说明:本文只是个人学习之用。

#############################################################################

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值