Python之@staticmethod和@classmethod的作用与区别

本文介绍了Python中定义类方法的三种方式:实例方法、类方法和静态方法。实例方法需要通过self参数调用,与类实例关联;类方法使用cls参数,直接与类交互;静态方法不依赖实例或类信息,常用于与类相关但不涉及实例或类状态的函数。文章还对比了三者之间的区别,并提供了示例代码。
摘要由CSDN通过智能技术生成
1. 类方法定义

Python中3种方式定义类方法:

  • 实例方法
  • 类方法(classmethod)
  • 静态方法(staticmethod)
1.1 实例方法

在类A里面的实例方法foo(self, x),第一个参数是self,我们需要有一个A的实例,才可以调用这个函数。

class A:
    def foo(self, x):
        print("running foo(%s, %s)" % (self, x))

# A.foo(x)  # 未实例化,这样会报错
a = A()
a.foo("test")  
1.2 类方法(classmethod)

当我们需要和类直接进行交互,而不需要和实例进行交互时,类方法是最好的选择。类方法与实例方法类似,但是传递的不是类的实例,而是类本身,第一个参数是cls。我们可以用类的实例调用类方法,也可以直接用类名来调用。

class A:
    class_attr = "attr"
    
    def __init__(self):
        pass
        
    @classmethod
    def class_foo(cls):
        print("running class_foo(%s)" % (cls.class_attr))

# 用类的实例调用类方法
a = A()
a.class_foo()

# 直接用类名来调用类方法
A.class_foo()
1.3 静态方法(staticmethod)

静态方法类似普通方法,参数里面不用self。这些方法和类相关,但是又不需要类和实例中的任何信息、属性等等。如果把这些方法写到类外面,这样就把和类相关的代码分散到类外,使得之后对于代码的理解和维护都是巨大的障碍。而静态方法就是用来解决这一类问题的。

比如我们检查是否开启了日志功能,这个和类相关,但是跟类的属性和实例都没有关系。

log_enabled = True

class A:
    class_attr = "attr"
    
    def __init__(self):
        pass
        
    @staticmethod
    def static_foo():
        if log_enabled:
            print("log is enabled")
        else:
            print("log is disabled")
        
# 直接用类名来调用静态方法
A.static_foo()
2. 三类方法之间的区别
class A(object):
    # 实例方法
    def foo(self, x):
        print("executing foo(%s,%s)" % (self, x))
        print('self:', self)
    
    # 类方法    
    @classmethod
    def class_foo(cls, x):
        print("executing class_foo(%s,%s)" % (cls, x))
        print('cls:', cls)
    
    # 静态方法    
    @staticmethod
    def static_foo(x):
        print("executing static_foo(%s)" % x)   
  • 实例方法:需要通过self参数隐式的传递当前类对象的实例。
  • 类方法:用@classmethod修饰,需要通过cls参数传递当前类对象。
  • 静态方法:用@staticmethod修饰,不需要表示自身对象的self和自身类的cls参数,与普通函数是一样的。

注:self和cls的区别不是强制的,只是PEP8中一种编程风格,slef通常用作实例方法的第一参数,cls通常用作类方法的第一参数。即通常用self来传递当前类对象的实例,cls传递当前类对象。

【参考博客】:

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值