为什么在Python中根据@staticmethod选择模块级别的函数(根据Google样式指南)? - python

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

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

该建议背后的原因是什么?

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

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

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

google python style guide

python大神给出的解决方案

如何理解《 Google Python样式指南》中的内容:

除非为了与现有库中定义的API集成而强制使用,否则切勿使用@staticmethod。改为编写模块级函数

好吧,您应该将其理解为Google的风格指南。如果您正在为Google编写Python代码,或者为符合该样式指南的项目做贡献,或者选择将其用于自己的项目,那么答案很简单:除了在以下情况下,不要使用@staticmethod由API强制执行。
这意味着没有判断调用的情况:类内部的效用函数不会被API强制为@staticmethod,因此不应为@staticmethod
出于@staticmethod的其他一些常见原因也是如此。如果您想要实例属性的默认值是要保留一个回调函数……太糟糕了,请寻找另一种编写方法(例如,在__init__中定义的局部函数)。如果您想要看起来像@classmethod的东西,但是明确地不与子类共存……太糟糕了,那就看起来就像@classmethod一样。

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

至于您的特定示例,正如我在评论中所说:事实上,您自然会发现自己编写的是some_utility_function(self.member)而不是self.some_utility_function(self.member)Foo.some_utility_function(self.member),这意味着从直觉上来说,您已经将其视为函数,而不是@staticmethod。在这种情况下,您绝对应该将其作为函数而不是@staticmethod编写。
那可能只是互联网上一个人的意见,但我认为大多数Python开发人员都会同意这种情况。有时候您会自然而然地发现自己在每次做出判断时都会在每个呼叫之前加上self.前缀。

1.好吧,并非完全常见。但是它们并不罕见,甚至永远不会出现。而且它们很常见,以至于在讨论关于Python 3弃用@staticmethod的问题时,很快有人提出了这两种情况,并提供了标准库中的示例,这足以让Guido终止讨论。
2.在Java中,没有模块级函数,因此您不得不编写静态方法来模拟它们。几年来,大多数大学的CS程序都集中在Java上,并且大量的软件是用Java编写的,所以很多人在编写Python类时使用了太多的@staticmethod(以及getter和setter等)。 Java-isms)。

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

如何打印浮点数的全精度[Python] - python

我编写了以下函数,其中传递了x,y的值:def check(x, y): print(type(x)) print(type(y)) print(x) print(y) if x == y: print "Yes" 现在当我打电话check(1.00000000000000001, 1.0000000000000002)它正在打印:<…

Python:检查新文件是否在文件夹中[重复] - python

This question already has answers here: How do I watch a file for changes? (23个答案) 3年前关闭。 我是python的新手,但是我尝试创建一个自动化过程,其中我的代码将侦听目录中的新文件条目。例如,某人可以手动将zip文件复制到一个特定的文件夹中,并且我希望我的代码能够在文件完全…