Python 中的 @classmethod 和 @staticmethod 有什么区别?

在 Python 中,@classmethod 和 @staticmethod 都是定义类方法的方法装饰器,但它们有一些关键区别:

1. @classmethod


    使用 @classmethod 装饰的方法第一个参数是 cls,它表示该方法属于类,而不是某个实例。

    @classmethod 可以访问类变量、其他类方法,并且可以用于创建类的辅助构造方法(例如常见的替代构造方法)。

    @classmethod 可以通过类本身调用,也可以通过实例调用,但它始终会将类作为第一个参数传递。


示例:


python


class MyClass:

    class_variable = "Hello, class!"


    @classmethod

    def class_method(cls):

        print(f"This is a class method. Class variable: {cls.class_variable}")


# 使用类调用

MyClass.class_method()


# 使用实例调用

obj = MyClass()

obj.class_method()


2. @staticmethod


    使用 @staticmethod 装饰的方法不需要 self 或 cls 参数,因为它既不依赖实例,也不依赖类。

    @staticmethod 可以在类中定义一个与类关联的独立功能,但它无法访问实例或类变量。

    它通常用于定义不依赖实例或类的辅助函数,但这些函数逻辑上属于类。


示例:


python


class MyClass:

    @staticmethod

    def static_method():

        print("This is a static method. It doesn't access class or instance attributes.")


# 使用类调用

MyClass.static_method()


# 使用实例调用

obj = MyClass()

obj.static_method()


区别总结


    @classmethod 第一个参数是 cls,可以访问类的状态(类变量、类方法等)。

    @staticmethod 没有任何默认参数,无法访问类或实例的状态,仅仅是一个逻辑上属于类的普通函数。

请使用浏览器的分享功能分享到微信等