静态方法的目的是什么?我怎么知道什么时候使用?
我在用这段代码写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 个回答
这段话虽然不是直接回答你的问题,但因为你说你是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的一个优点是,它并不强制你在所有情况下都使用类。你可以在有数据或状态需要和方法关联的时候才使用类,这就是类的用途。否则,你可以使用函数,而函数就是用来做这个的。
请查看这篇文章,了解详细解释。
简而言之
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. 这允许方法的重写,如果这个方法是在模块级别定义的(也就是在类外面),子类将无法重写这个方法。
静态方法的用处有限,因为它们不能访问类实例的属性(而普通方法可以),也不能访问类本身的属性(而类方法可以)。
所以,静态方法在日常使用中并不太实用。
不过,它们可以用来把一些工具函数和类放在一起,比如简单的类型转换,这些函数只需要依赖传入的参数(可能还会用到一些全局的属性)。
这些函数本来可以放在类外面,但如果它们只在这个类里有用,把它们放在类里面可能更合适。
你还可以通过实例或类来引用这个方法,而不是通过模块名,这样可以帮助读者更好地理解这个方法和哪个实例相关。