在Python中使用@staticmethod和全局函数有什么区别?
我已阅读在Python中使用@staticmethod和全局函数有什么区别?
- What is the difference between @staticmethod and @classmethod in Python?
- Python @classmethod and @staticmethod for beginner?
由于staticmethod
不能访问类的实例,我不知道什么是betweent并global function
区别?
何时应该使用staticmethod
?可以举个很好的例子吗?
一个静态方法包含在一个类中(添加@MartijnPieters指出的名称空间)。全局函数不是。
它不是;它仅在类中包含*,添加一个名称空间。 – 2013-02-20 09:17:54
@MartijnPieters:我错误的措辞,有点..更新。我的意图是说它被绑定到一个类,并不像你的描述那么清晰(因为绑定到一个类并绑定到一个类的**实例**之间可能会混淆,而这并不是我的意思)。 – 2013-02-20 09:20:26
与全局函数类似,静态方法不能访问包含类的实例。但它在概念上属于包含类。另一个好处是它可以避免名称冲突。
当函数被设计为服务给定的某个类时,建议将其作为该类的静态方法。这叫做cohesion。另外,如果这个函数不在外面使用,你可以在它之前加上下划线来标记它为“private”,这叫做information hiding(尽管Python并不真正支持私有方法)。作为一个经验法则,尽可能少的接口暴露将使代码更加干净,不易改变。
即使该函数应该作为跨多个模块的许多类的共享实用程序,使其成为全局函数仍然不是第一选择。考虑将它作为一些实用类的静态方法,或者使其成为某个专用模块中的全局函数。其中一个原因是将类似用途的功能收集到一个普通的类或模块中,这对于另一个级别的抽象/模块化是有利的(对于小型项目,有些人可能会认为这是过度工程)。另一个原因是这可能会减少命名空间的污染。
“即使该函数应该作为许多类的共享工具,仍然不推荐将其作为全局函数。”:这是我的新闻..是的,我知道命名空间是一件好事,但这是哪里建议(我可能错过了它)?.. – 2013-02-20 09:25:58
@DemianBrecht我更新了我的答案。 – 2013-02-20 10:10:40
“即使该函数应该用作许多类的共享工具,仍然不推荐将其作为全局函数”=>嗯,实际上,是的,建议在没有函数时使用普通函数这是采取静态方法的一个很好的理由。 wrt/namespaces,模块已经是命名空间。 – 2013-02-20 12:23:55
IMO它更像是一个设计问题,而不是技术问题。如果你觉得这个逻辑属于一个类(不是实例),那么把它作为一个staticmethod
添加,如果它是不相关的,就把它作为一个全局函数来实现。
例如:
class Image(object):
@staticmethod
def to_grayscale(pixel):
# ...
IMO优于
def to_grayscale(pixel):
#...
class Image(object):
# ...
我opion最好的答案是你的第一个链接的批准答案顶部评论:“一个静态方法并非一无是处 - 这是一种将函数放入类中的方法(因为它在逻辑上属于该类),同时指示它不需要访问该类。“你可以想像'datetime'类具有特定日期相关事物的静态方法,但这些函数也可能在模块级别。 – Evert 2013-02-20 09:23:20