为什么要在Python中通过@staticmethod选择模块级别的功能(根据Google样式指南)?

问题描述 投票:-1回答:2

根据Google Python样式指南,(几乎)绝对不应使用静态方法:

除非为了与在现有库中定义的API。编写模块级功能代替

提出此建议的原因是什么?

这仅适用于Google还是在Python中使用静态方法还有其他(更一般的)缺点?

特别是,如果我想在将由该类的其他公共成员函数调用的类中实现实用程序功能,最佳实践是什么?

class Foo: 
    .......
    def member_func(self): 
        some_utility_function(self.member)

google python style guide

python static-methods
2个回答
5
投票

如何理解说的Google Python样式指南:

除非绝对要与现有库中定义的API集成,否则请不要使用@staticmethod。改为编写模块级函数

嗯,您应该将其理解为Google的风格指南。如果您要为Google编写Python代码,或者为符合该样式指南的项目做贡献,或者选择将其用于自己的项目,那么答案很简单:除了在以下情况下,不要使用@staticmethod由API强制执行。

这意味着没有判断调用的情况:类内部的效用函数不会被API强制为@staticmethod,因此不应为@staticmethod

由于@staticmethod的其他一些常见原因[[1,这同样适用。如果您想为实例属性设置一个默认值,该默认值将保留一个回调函数……太糟糕了,请寻找另一种写该方法的方法(例如,在__init__内部定义的局部函数)。如果您想要的东西看起来像@classmethod,但明确地不与子类共存……太糟糕了,那就看起来像@classmethod


当然,如果您

not遵循Google的风格指南,那么您应该将其理解为只是众多观点中的一种。对于@staticmethod,很多Python开发人员并不像该指南那么难。当然,Google是许多Python代码的杰出开发者。另一方面,Google的风格指南是在编写Java主义时才编写的,而现在则是一个更大的问题。2但是,您可能不想过多地考虑每个观点的重要性。相反,重要的是,学习问题并提出自己的看法。


[关于您的特定示例,正如我在评论中说的:事实上,您自然会发现自己写的是some_utility_function(self.member)而不是self.some_utility_function(self.member)Foo.some_utility_function(self.member),这意味着从直觉上来说,您已经将其视为函数,不是@staticmethod。在这种情况下,您绝对应该将其写为函数,而不是@staticmethod

这可能只是互联网上一个人的意见,但我认为大多数Python开发人员在这种情况下都会同意。这是您

do自然会发现自己在每次进行判断调用时都会在每个调用之前以self.为前缀的时间。


1。好吧,不完全是common

。但是它们并不罕见,所以它们永远不会出现。而且它们很常见,以至于在讨论有关不推荐使用Python 3的@staticmethod时,很快有人提出了这两种情况,并提供了标准库中的示例,这足以让Guido终止讨论。
] >

2。在Java中,没有模块级功能,因此您不得不编写静态方法来模拟它们。几年来,大多数大学CS程序都集中在Java上,并且大量的软件是用Java编写的,所以很多人在编写Python类时使用了太多的@staticmethod(以及getter和setter等)。 Java-isms)。


1
投票
您将调用写入some_utility_function()的方式,无论如何在类中都没有定义。如果是这样,您将使用self.some_utility_function()或可能使用Foo.some_utility_function()对其进行调用。因此,您已经按照样式指南的建议进行了操作。
© www.soinside.com 2019 - 2024. All rights reserved.