当前位置: 首页 > 面试题库 >

python-我应该使用静态方法还是顶级函数

燕砚文
2023-03-14
问题内容

我来自Java背景,是python的新手。我有几个脚本,它们共享一些与读取和写入文件有关的应用程序特有的辅助功能。有些功能与阅读有关,有些与写作有关。在寻找正确的方法时,我看到了这一点:Python中的静态方法?

他在回答中提到:

最后,请谨慎使用staticmethod!在极少数情况下,Python中需要使用静态方法,而我已经看到它们使用了很多次,而使用单独的“顶层”函数会更加清楚。

我不太了解顶层函数,因此我不确定给出一个更好的简单示例:1)为具有静态阅读器功能的阅读器创建一个类,与为书写器创建的类相同,或者2)声明这些帮助器作为全局功能,为什么?

编辑: 真正 了解这个问题我刚刚发现好文章http://tomayko.com/writings/the-static-method-
thing


问题答案:

在Java中,有一个(恕我直言是错误的)想法,它在所有地方都使用类,甚至只是将不共享任何状态的静态函数组合在一起(因此,此类永远都不会被实例化)。

这里的Python有所不同。如果您的函数没有某些共享状态1(因此在Java中通常是static函数),并且与“真实”类(=实际上已实例化的)没有紧密关系,则只需在模块。

其背后的原因是,仅当您实际要实例化它时才需要一个类,因此,将类作为多个不需要共享特定于实例的状态的函数的容器是没有用的。

实际上,您可以在 某种程度上 将模块视为static类-即,包含函数(=静态方法),模块变量(= static字段)和类型的容器。

Python的优点在于,拥有顶层函数不会带来全局命名空间污染的问题,因为在Python中顶层函数/ objects /
…仍然是模块作用域的。因此,您仍然可以按模块对功能进行分组,而无需不必要的class-tax。

  1. 实际上,它们 可以 以模块级变量(即单例)的形式具有某种共享状态;再次,类比模块静态类似乎成立。


 类似资料:
  • 我来自Java背景,对python不熟悉。我有几个脚本,它们共享与读取和写入文件相关的应用程序独有的一些帮助函数。一些功能与阅读相关,一些与写作相关。在搜索正确的方法时,我看到了这个:Python中的静态方法? 他在回答中提到: 最后,谨慎使用staticmethod!Python中很少需要静态方法,我也见过很多次使用静态方法时,单独的“顶级”函数会更加清晰。 我不太理解顶级函数,我不确定给出这个

  • 我正在使用存储库模式并尝试建立模型之间的关系。当我尝试运行存储()方法(在控制器中),该方法试图使用用户()方法(与方模型建立关系)时,我收到以下错误消息: 非静态方法不应该静态调用::user(),假设$this来自不兼容的上下文 我不明白为什么在尝试运行user()relationship方法时会出现此错误,但所有其他方法(包括$this- 以下是相关代码:

  • 问题内容: 我正在使用Python2.x。 比较时我的编辑会警告我,但使用时不会警告。 我在Python Shell中进行了测试,并确定两者都是有效的语法,但我的编辑器似乎在说这是首选。 是这样吗?如果是,为什么? 问题答案: 摘要: 使用时要核对对象的身份(如检查,看看是否是)。使用时要检查的平等(例如是等于?)。 说明: 你可以在其中返回的自定义类True 例如: is检查对象身份。只有1个对

  • 当我比较,但是当我使用。 我在pythonshell中做了一个测试,确定两者都是有效语法,但我的编辑器似乎在说是首选。 情况是否如此,如果是,原因何在?

  • 问题内容: 我正在使用c / c 为osx和linux开发命令行界面可执行文件。该项目将链接到opencv。我应该使用libc 还是libstdc ++? 问题答案: 我会为每个操作系统使用本机库,即GNU / Linux上的libstdc 和Mac OS X上的libc 。 libc 在GNU / Linux上不是100%完整的,而libstdc 更完整时使用libc并没有真正的优势。另外,如果

  • 问题内容: 和CSS 和有什么不一样?我应该使用哪一个?为什么? 问题答案: 所有这些答案似乎都是不正确的。与直觉相反,在CSS 中不是pixel 。至少不是在简单的物理意义上。 从W3C,EM,PX,PT,CM,IN…阅读本文,了解如何为CSS发明一个“神奇的”单元。的含义因硬件和分辨率而异。(该文章是最新的,最新更新为2014-10。) 我自己的思考方式: px单位是CSS的魔术单位。它与当前