在 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,但又可以独立使用,从而提高了代码的组织性和可读性。
