在Python中使用静态方法的优点是什么?

2024-05-14 19:29:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中遇到了unbound方法错误

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

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

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

在阅读了许多有用的文章之后,我想到了如何添加上面的@staticmethod来使代码工作。我是个Python新手。有人能解释一下为什么要定义静态方法吗?或者,为什么不是所有的方法都定义为静态方法?


Tags: sample方法定义object错误thislistclass
3条回答

这并不是你真正要问的问题,但是既然你已经说过你是一个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的一个优点是它不会强迫您对所有内容使用类。只有当存在应该与方法关联的数据或状态时,才可以使用它们,这就是类的用途。否则您可以使用函数,这就是函数的用途。

详细说明见this article

TL;DR

1.它消除了self参数的使用。

2.它减少了内存使用,因为Python不必为每个对象实例化bound-method

>>>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.它允许方法重写,因为如果方法是在模块级(即类之外)定义的,则子类将无法重写该方法。

静态方法的用途有限,因为它们不能访问类实例的属性(像常规方法那样),也不能访问类本身的属性(像类方法那样)。

所以它们对日常方法没有用处。

但是,它们可以用于将一些实用程序函数与一个类(例如,从一种类型到另一种类型的简单转换)组合在一起,该类不需要访问除了所提供的参数以外的任何信息(可能还有一些对模块全局的属性)

它们可以放在类之外,但是在类内部对它们进行分组可能有意义,因为它们只适用于类。

您还可以通过实例或类而不是模块名来引用方法,这可能有助于读者理解该方法与哪个实例相关。

相关问题 更多 >

    热门问题