python - @staticmethod和@classmethod的作用与区别

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

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

这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。


既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别

从它们的使用上来看,
@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数
如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。

而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。

下面上代码。

class A(object):
    bar = 1
    def foo(self):
        print 'foo'
 
    @staticmethod
    def static_foo():
        print 'static_foo'
        print A.bar
 
    @classmethod
    def class_foo(cls):
        print 'class_foo'
        print cls.bar
        cls().foo()
 
A.static_foo()
A.class_foo()


输出
static_foo
1
class_foo
1
foo

原文链接:https://blog.youkuaiyun.com/handsomekang/article/details/9615239

Python面向对象编程中,`@staticmethod` `@classmethod` 是两个常用的装饰器,它们可以改变方法的调用方式行为,二者存在以下区别: ### 调用方式 - **`@staticmethod`**:可以被类直接调用,也能被类的实例调用。例如: ```python class A(object): @staticmethod def static_foo(x): print(f"executing static_foo({x})") # 类直接调用 A.static_foo('hi') # 实例调用 a = A() a.static_foo(1) ``` - **`@classmethod`**:同样既可以被类直接调用,也能被类的实例调用。例如: ```python class A(object): @classmethod def class_foo(cls, x): print(f"executing class_foo({cls}, {x})") # 类直接调用 A.class_foo(1) # 实例调用 a = A() a.class_foo(1) ``` ### 参数传递 - **`@staticmethod`**:不需要额外的默认参数,就像普通函数一样,调用时传入定义的参数即可。如上述代码中的 `static_foo(x)` ,只需要传入 `x` 参数。 - **`@classmethod`**:第一个参数必须是类本身,通常约定为 `cls` 。这个参数在调用时由Python自动传入,代表调用该方法的类。例如上述代码中的 `class_foo(cls, x)` ,`cls` 代表类 `A` [^2][^3][^4]。 ### 功能用途 - **`@staticmethod`**:主要用于把类相关的一些实用工具函数组织到类中,逻辑上属于类,但不需要访问类或实例的属性方法,更像是一个独立的函数,只是放在类的命名空间下,有利于代码的组织命名空间的整洁 [^1]。 - **`@classmethod`**:常用于实现类相关的工厂方法,通过类本身来创建实例,或者修改类级别的属性。因为它可以访问类,所以可以根据类的不同状态创建不同的实例 [^2]。 ### 对类属性的访问 - **`@staticmethod`**:不能直接访问类属性,因为它没有传入类或实例的引用。 - **`@classmethod`**:可以通过 `cls` 参数访问修改类属性,能够对类的状态进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值