在Python中使用@staticmethod和全局函数有什么区别?

时间:2013-02-20 09:14:08

标签: python decorator

我已阅读

由于staticmethod无法访问该课程的实例,我不知道它与global function之间的区别是什么?

什么时候应该使用staticmethod?能给出一个很好的例子吗?

3 个答案:

答案 0 :(得分:2)

与全局函数一样,静态方法无法访问包含类的实例。但它在概念上属于包含类。另一个好处是它可以避免名称冲突。

当函数被设计为服务于某个给定的类时,建议将它作为该类的静态方法。这称为cohesion。此外,如果此函数未在外部使用,则可以在其之前添加下划线以将其标记为“私有”,这称为information hiding(尽管Python并不真正支持私有方法)。根据经验,尽可能少地暴露接口会使代码更干净,更不容易改变。

即使该函数应该作为跨多个模块的许多类的共享实用程序,使其成为全局函数仍然不是第一选择。考虑将其作为某个实用程序类的静态方法,或使其成为某个专用模块中的全局函数。其中一个原因是将类似用途的函数收集到一个公共类或模块中,这对于另一个级别的抽象/模块化是有利的(对于小项目,有些人可能会认为这是过度工程)。另一个原因是这可能会减少命名空间污染。

答案 1 :(得分:0)

静态方法包含在类中(添加@MartijnPieters指出的命名空间)。全局功能不是。

答案 2 :(得分:0)

IMO它更像是一个设计问题,而不是技术问题。如果您认为逻辑属于某个类(而不是实例),请将其添加为staticmethod,如果它不相关,则将其作为全局函数实现。

例如:

class Image(object):
    @staticmethod
    def to_grayscale(pixel):
        # ...

IMO优于

def to_grayscale(pixel):
    #...

class Image(object):
    # ...