前言

Python中的类方法和静态方法是面向对象编程中常用的两种方法类型,它们的作用是为类的实例或类本身提供特定的功能。在本文中,我们将深入探讨这两种方法,包括其定义、区别、用法及使用场景

类方法

类方法是定义在类上的方法,它可以通过类或者类的实例来调用。类方法使用@classmethod装饰器进行标识,其中第一个参数通常被命名为cls,表示类本身,而不是类的实例。类方法可以使用类的属性和方法,但不能访问实例的属性和方法。

定义和使用如下所示

class MyClass:

    @classmethod
    def my_class_method(cls, arg1, arg2):
        print("Class method called with args:", arg1, arg2)


MyClass.my_class_method(1, 2)
# 输出:Class method called with args: 1 2

obj = MyClass()
obj.my_class_method(3, 4)
# 输出:Class method called with args: 3 4

类方法在以下情况下很有用:

  • 当需要在类的级别上执行操作时,而不是在实例级别上执行操作时。
  • 当需要使用类的属性和方法时,而不需要访问实例的属性和方法时。

使用场景

  • 创建一个工厂方法来创建类的实例,而不需要暴露类的构造函数。
  • 计算类中所有实例的平均值、最大值、最小值等统计信息。
  • 在类中实现单例模式,即限制该类只能有一个实例。

下面是一个使用类方法实现单例的例子

class Singleton:
    _instance = None

    def __init__(self):
        if Singleton._instance:
            raise Exception("只能实例化一次")
        Singleton._instance = self

    @classmethod
    def get_instance(cls):
        if not cls._instance:
            cls()
        return cls._instance


s1 = Singleton.get_instance()
s2 = Singleton.get_instance()

print(s1)
print(s2)

输出结果

<__main__.Singleton object at 0x1053dd550>
<__main__.Singleton object at 0x1053dd550>

静态方法

静态方法是定义在类上的方法,它可以通过类或者类的实例来调用。静态方法使用@staticmethod装饰器进行标识,它不需要类或实例作为第一个参数。与类方法不同,静态方法不能访问类或实例的属性和方法。

定义及使用

class MyClass:

    @staticmethod
    def my_static_method(arg1, arg2):
        print("Static method called with args:", arg1, arg2)


MyClass.my_static_method(1, 2)
# 输出:Static method called with args: 1 2

obj = MyClass()
obj.my_static_method(3, 4)
# 输出:Static method called with args: 3 4

使用场景

  • 在类中实现一些与类相关的操作,但不需要访问类的属性和方法时。
  • 定义一个与类无关的辅助函数,但又不想将其定义在类之外。

通常可以放一些该类会用到的工具方法

比如现在有一本书要入库,但是入库时间按我们自己的格式去写,这个时候就可以把这个时间抽象成一个静态方法,代码如下

import datetime


class Book:

    @staticmethod
    def format_date(date_str):
        return datetime.datetime.strptime(date_str, '%Y-%m-%d').date()

    @classmethod
    def save(cls, line):
        values = line.strip().split(',')
        # 假设入库,用打印信息来代替
        book_info = {
            'title': values[0],
            'author': values[1],
            'published_date': cls.format_date(values[2]),
            'pages': int(values[3]),
        }
        return book_info


book_info = Book.save('java,wendell,2023-04-01,300')
print(book_info)

输出结果

{'title': 'java', 'author': 'wendell', 'published_date': datetime.date(2023, 4, 1), 'pages': 300}

总结

在Python中,类方法和静态方法是非常有用的工具,它们可以让我们在类的级别上执行操作,而不是在实例级别上执行操作。类方法可以使用类的属性和方法,而静态方法则不能。使用这些方法可以让我们更好地组织代码,并提高代码的可读性和可维护性。在使用这些方法时,我们需要根据具体的情况来选择使用类方法还是静态方法。


欢迎关注,学习不迷路!

04-05 15:10