Python 静态方法

在 Python 中,类的方法可以分为 3 种:实例方法(Instance Method)、类方法(Class Method)和静态方法(Static Method)。本文将重点介绍静态方法。

Python 静态方法简介

如果小伙伴们接触过其他编程语言,可能会知道类的静态成员包括静态变量和静态方法这两种。但 Python 是不支持静态变量的,因为 Python 是一门动态语言,不存在完全静态的变量。不过 Python 却是支持静态方法的。

在 Python 中,我们可以使用 @staticmethod 装饰器来定义一个静态方法。

语法:

@staticmethod
def 方法名 ():
    ……

说明:

静态方法在定义时,需要在定义的上面加上一个 “@staticmethod” ,然后定义部分跟普通函数的定义是一样的。

类方法和实例方法都需要强制传入指定的参数,其中类方法需要传入 “cls” 作为第 1 个参数,而实例方法需要传入 “self” 作为第 1 个参数。但是对于静态方法来说,它不需要强制传入任何参数。

静态方法是定义在类中的函数,但它们与类的实例没有关联,也与类本身没有直接关联。在静态方法中,我们无法访问类的实例属性(self)或类属性(cls)。因为它们本质上是普通的函数,只是逻辑上归属于某个类。

我们可以把静态方法看作是:一个放在类内部的普通函数。它不操作实例,也不操作类,只进行一些独立的、与类相关的操作。

提示: 如果小伙伴们不了解装饰器是什么,可以查看:Python 装饰器

Python 静态方法示例

接下来,我们通过几个简单的例子来讲解 Python 静态方法是如何使用的。

示例 1:静态方法的基本用法

class Hero():
    count = 0
    def __init__(self, name, type):
        self.name = name
        self.type = type
        Hero.count += 1
        
    # 定义实例方法
    def skill(self):
        print(f'{self.name}放大招啦!')
        
    # 定义类方法
    @classmethod
    def getcount(cls):
        print(f'当前英雄总数为:{cls.count}')
        
    # 定义静态方法
    @staticmethod
    def add(x, y):
        print(x + y)

h1 = Hero('船长', '力量型')

# 调用静态方法
Hero.add(1, 2)
h1.add(1, 2)

运行结果如下。

3
3

分析:

从这个例子可以看出,类或实例都可以调用静态方法,这两种方式没有什么区别。其中 Hero.add(1, 2) 是通过类名来调用静态方法的,而 h1.add(1, 2) 是通过实例名来调用静态方法的。

静态方法无法访问实例属性,一般也不会和类本身进行交互,它只是起了一个类似函数工具库的作用。从这也可以看出,静态方法就跟普通函数差不多。

示例 2:用于工具函数或辅助函数

class StringUtils:
    @staticmethod
    def is_palindrome(text):
        # 判断字符串是否是回文
        cleaned_text = ''.join(filter(str.isalnum, text)).lower()
        return cleaned_text == cleaned_text[::-1]

    @staticmethod
    def count_vowels(text):
        # 计算字符串中的元音字母数量
        vowels = 'aeiouAEIOU'
        return sum(1 for char in text if char in vowels)

# 判断是否回文
print(StringUtils.is_palindrome('Madam'))
print(StringUtils.is_palindrome('Hello'))

# '计算元音字母的数量
print(StringUtils.count_vowels('Python Programming'))

运行结果如下。

True
False
4

分析:

当一个函数逻辑上与某个类相关,但它不依赖于该类的任何特定实例数据时,将其定义为静态方法是一个好选择。

在这个例子中,我们定义了一个名为 StringUtils 的类。该类用于封装字符串处理相关的工具函数。is_palindrome() 和 count_vowels() 都是静态方法,因为它们只对输入的字符串进行操作,而不涉及 StringUtils 类的任何实例状态或类状态。

这种方式使得这些工具函数逻辑上归属于 StringUtils,但又可以独立使用,从而提高了代码的组织性和可读性。

上一篇: Python 类的属性和方法

下一篇: Python 继承

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号