在Python中使用@staticmethod和全局函数有什么区别?
我看过
因为staticmethod
不能访问这个类的实例,我不太明白它和全局函数
有什么区别?
那什么时候应该使用staticmethod
呢?能给个好的例子吗?
3 个回答
0
静态方法是属于一个类的(就像@MartijnPieters提到的,它有一个命名空间)。而全局函数则不是属于任何类的。
0
我认为这更像是一个设计方面的问题,而不是技术问题。如果你觉得某个逻辑属于一个类(而不是类的实例),那就把它作为一个 staticmethod
来添加。如果这个逻辑和类没有关系,那就把它实现为一个全局函数。
举个例子:
class Image(object):
@staticmethod
def to_grayscale(pixel):
# ...
我觉得这样比下面的方式更好:
def to_grayscale(pixel):
#...
class Image(object):
# ...
6
像全局函数一样,静态方法不能访问它所在类的实例。但从概念上讲,它属于这个类。另一个好处是,它可以避免名字冲突。
当一个函数是为了某个特定类而设计时,最好把它做成这个类的静态方法。这被称为内聚性。另外,如果这个函数不打算在外部使用,可以在它前面加个下划线,表示它是“私有”的,这叫做信息隐藏(尽管Python并不真正支持私有方法)。一般来说,尽量暴露少量接口会让代码更干净,也不容易出问题。
即使这个函数是为了多个类共享的工具,做成全局函数也不是首选。可以考虑把它作为某个工具类的静态方法,或者在某个专门的模块里做成全局函数。这样做的一个原因是,把功能相似的函数放到一个公共类或模块里,有助于更高层次的抽象和模块化(对于小项目,有些人可能会觉得这样做是过度设计)。另一个原因是,这样可以减少命名空间的污染。