python中的普通方法,类方法和静态方法的区别

2 阅读2分钟

一个包含普通方法、类方法和静态方法的示例类。通过这个例子,你可以更清楚地理解这三种方法的区别和使用场景。

示例代码

class Example:
    class_attribute = "class value"  # 类属性

    def __init__(self, instance_value):
        self.instance_attribute = instance_value  # 实例属性

    # 普通方法(实例方法)
    def instance_method(self):
        print("Instance method called")
        print("Accessing class attribute via self:", self.class_attribute)
        print("Accessing instance attribute:", self.instance_attribute)

    # 类方法
    @classmethod
    def class_method(cls):
        print("Class method called")
        print("Accessing class attribute via cls:", cls.class_attribute)
        
        # 不能直接访问实例属性,但可以通过实例调用
        # print(self.instance_attribute)  # 这行会报错

    # 静态方法
    @staticmethod
    def static_method():
        print("Static method called")
        # 不能直接访问类属性或实例属性
        # print(cls.class_attribute)  # 这行会报错
        # print(self.instance_attribute)  # 这行会报错

# 创建实例
example_instance = Example("instance value")

# 调用实例方法
example_instance.instance_method()

# 调用类方法
Example.class_method()
example_instance.class_method()  # 也可以通过实例调用类方法

# 调用静态方法
Example.static_method()
example_instance.static_method()  # 也可以通过实例调用静态方法

输出

Instance method called
Accessing class attribute via self: class value
Accessing instance attribute: instance value
Class method called
Accessing class attribute via cls: class value
Static method called

详细说明

  1. 普通方法(实例方法)

    • 定义时,第一个参数是 self,表示实例对象本身。
    • 可以访问类属性和实例属性。
    • 需要通过实例对象调用。
    def instance_method(self):
        print("Instance method called")
        print("Accessing class attribute via self:", self.class_attribute)
        print("Accessing instance attribute:", self.instance_attribute)
    

    调用:

    example_instance.instance_method()
    
  2. 类方法

    • 使用 @classmethod 装饰。
    • 定义时,第一个参数是 cls,表示类本身。
    • 可以访问和修改类属性,但不能直接访问实例属性。
    • 可以通过类名或实例对象调用。
    @classmethod
    def class_method(cls):
        print("Class method called")
        print("Accessing class attribute via cls:", cls.class_attribute)
    

    调用:

    Example.class_method()
    example_instance.class_method()
    
  3. 静态方法

    • 使用 @staticmethod 装饰。
    • 定义时,没有默认的第一个参数(如 selfcls)。
    • 不能访问类属性或实例属性。
    • 适用于独立于类和实例的功能。
    • 可以通过类名或实例对象调用。
    @staticmethod
    def static_method():
        print("Static method called")
    

    调用:

    Example.static_method()
    example_instance.static_method()
    

通过这个例子,你可以看到:

  • 普通方法需要通过实例调用,能够访问类属性和实例属性。
  • 类方法可以通过类名或实例调用,主要用于访问和修改类属性。
  • 静态方法可以通过类名或实例调用,但不能访问类属性或实例属性,主要用于与类和实例无关的功能。