静态方法的目的是什么?我怎么知道什么时候使用?

133 投票
10 回答
74306 浏览
提问于 2025-04-15 20:23

我在用这段代码写Python的时候遇到了“未绑定的方法错误”:

import random

class Sample(object):
    def drawSample(samplesize, List):
        sample = random.sample(List, samplesize)
        return sample

Choices=range(100)
print(Sample.drawSample(5, Choices))

我通过给这个方法加上 @staticmethod 来解决了这个问题。不过,我其实并不太明白这是怎么回事。

使用“静态”方法有什么意义呢?为什么在这段代码中这样做能解决问题?它们到底什么时候是必要的?相反,我又为什么不想这么做呢(也就是说,为什么需要额外的代码来把这个方法变成静态的)?

10 个回答

36

这段话虽然不是直接回答你的问题,但因为你说你是Python新手,所以我觉得可能会对你有帮助,而且其他人也没有明确提到这一点。

我绝对不会通过把方法改成静态方法来修复上面的代码。我可能会直接放弃这个类,写一个函数:

def drawSample(samplesize,List):
    sample=random.sample(List,samplesize)
    return sample

Choices=range(100)
print drawSample(5,Choices)

如果你有很多相关的函数,可以把它们放在一个模块里,也就是把它们都放在同一个文件里,比如叫做sample.py;然后

import sample

Choices=range(100)
print sample.drawSample(5,Choices)

或者我会给这个类添加一个__init__方法,创建一个实例,这样就能有一些有用的方法:

class Sample(object):
'''This class defines various methods related to the sample'''

    def __init__(self, thelist):
        self.list = thelist

    def draw_sample(self, samplesize):
        sample=random.sample(self.list,samplesize)
        return sample

choices=Sample(range(100))
print choices.draw_sample(5)

(我还在上面的例子中调整了命名风格,以符合PEP 8的推荐样式。)

Python的一个优点是,它并不强制你在所有情况下都使用类。你可以在有数据或状态需要和方法关联的时候才使用类,这就是类的用途。否则,你可以使用函数,而函数就是用来做这个的。

270

请查看这篇文章,了解详细解释。

简而言之

1. 这可以省去使用 self 参数。

2. 这能减少内存使用,因为Python不需要为每个实例化的对象创建一个绑定方法

>>>RandomClass().regular_method is RandomClass().regular_method
False
>>>RandomClass().static_method is RandomClass().static_method
True
>>>RandomClass.static_method is RandomClass().static_method
True

3. 这提高了代码的可读性,表明这个方法不依赖于对象本身的状态。

4. 这允许方法的重写,如果这个方法是在模块级别定义的(也就是在类外面),子类将无法重写这个方法。

168

静态方法的用处有限,因为它们不能访问类实例的属性(而普通方法可以),也不能访问类本身的属性(而类方法可以)。

所以,静态方法在日常使用中并不太实用。

不过,它们可以用来把一些工具函数和类放在一起,比如简单的类型转换,这些函数只需要依赖传入的参数(可能还会用到一些全局的属性)。

这些函数本来可以放在类外面,但如果它们只在这个类里有用,把它们放在类里面可能更合适。

你还可以通过实例或类来引用这个方法,而不是通过模块名,这样可以帮助读者更好地理解这个方法和哪个实例相关。

撰写回答