Python 内置函数 staticmethod 和 classmethod

本文详细介绍了Python中@staticmethod和@classmethod的区别与用法。staticmethod不需要self或cls参数,可以直接类调用,不涉及对象;classmethod需要cls参数,用于操作类属性或实例化对象,可通过继承改变。总结了两者的特性及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言 

        一般的实例化方法,必须实例化类之后才能被调用,Python 不会自动为第一个参数 self 绑定调用者,因此实例方法的调用者是类本身,而不是对象,需要传入参数值,如下代码没有传入参数值则会报错:

TypeError: func1() missing 1 required positional argument: 'self'

class Y(object):
    def func1(self):
        print("func1")

Y.func1()
# Y.func1('Yy_Rose')

        而  staticmethod 和 classmethod 可以不需要实例化,直接 类名.方法名( ) 来调用,也可以不实例化调用该方法 类名.方法名( ),它们的参数是可以直接被调用的。

classmethod

        classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等:

# 样式
class Y(object):
    @classmethod
    def f(cls,arg1, arg2, ...):
        ...
class Y(object):
    class_type = '类属性'

    def func1(self):
        print("func1")
        print(self)

    # 类方法(不需要实例化类就可以被类本身调用)
    @classmethod
    def func2(cls):
        print("func2")
        # cls:表示没被实例化的类本身
        print(cls)
        print(cls.class_type)
        # 调用类方法
        cls().func1()


Y.func1('Yy_Rose')
'''
输出结果:
func1
Yy_Rose
'''
Y().func2()
'''
输出结果:
func2
<class '__main__.Y'>
类属性
func1
<__main__.Y object at 0x000001D38A421BE0>
'''

staticmethod

        staticmethod 函数返回函数的静态方法,该方法不强制要求传递参数:

# 样式
class Y(object):
    @staticmethod
    def f(arg1, arg2, ...):
        ...
class Y(object):
    # 静态方法
    @staticmethod
    def f():
        print('Yy_Rose')
 
Y.f()          # 静态方法无需实例化
cobj = Y()
cobj.f()        # 也可以实例化后调用
'''
输出结果:
Yy_Rose
Yy_Rose
'''

        staticmethod 函数的参数要求为可调用的,所以类也是可以的:

class Class1(object):
    @staticmethod
    class Class2(object):
        def __init__(self, val):
            self.val = val

        def blogger(self):
            print(f"您正在浏览的博主是: {self.val} ~")


inv = Class1.Class2('Yy_Rose')
inv.blogger()  # 输出 : 您正在浏览的博主是: Yy_Rose ~

总结 

        @staticmethod 函数不需要表示自身对象的 self 和自身类的 cls 参数,就跟使用函数一样,只不过是在类中定义的函数,它是可调用的,无需先实例化类,它的定义通过继承是不可变的。

        @classmethod 函数也不需要 self 参数,也可以在不实例化类的情况下调用,但它的定义通过继承遵循子类,而不是父类,这是因为函数的第一个参数必须始终是表示自身类的 cls 参数。

         @staticmethod 和 @classmethod 的区别:Stack Overflow

                                                                                  Python Central

                                                                                  GitHub

         @staticmethod 和 @classmethod 的用途: 知乎

         参考博客:@staticmethod和@classmethod的用法

                           Python进阶:@classmethod和@staicmethod

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值