我来自Java背景,对python不熟悉。我有几个脚本,它们共享与读取和写入文件相关的应用程序独有的一些帮助函数。一些功能与阅读相关,一些与写作相关。在搜索正确的方法时,我看到了这个:Python中的静态方法?
他在回答中提到:
最后,谨慎使用staticmethod!Python中很少需要静态方法,我也见过很多次使用静态方法时,单独的“顶级”函数会更加清晰。
我不太理解顶级函数,我不确定给出这个简单的例子哪个更好:1)为具有静态读取器函数的读取器创建一个类,对于编写器也一样,或者2)将这些助手声明为全局函数,为什么?
编辑:我刚找到一篇关于这个主题的很好的文章http://tomayko.com/writings/the-static-method-thing
如果函数与类相关,则将其设为静态方法。例如:
class DBobject():
name = StringProperty()
@staticmethod
def get_by_name(name):
return db.select('select * from DBobject where name = "%s"' % name)
python = DBobject.get_by_name('python')
也就是说,该方法与DBobject类完全相关,因此它应该是一个静态方法。
从Python的禅宗中(导入此内容):
Namespaces are one honking great idea -- let's do more of those!
在Java这样的语言中创建静态方法的主要原因之一是确保这些方法不会最终污染全局名称空间。(尽管Java通过完全不允许“包级别”函数来强制执行自己的命名空间约定!)在Python中,所有“顶级”函数都自动放置在包含这些函数的模块的名称空间中,因此不会有这样污染全局名称空间的危险。
换句话说,像许多其他语言一样,Python可以以几种不同的方式创建命名空间。在这种情况下,当一个模块服务于相同的命名空间目的而没有与定义类相关的混乱(或认知负载)时,几乎没有必要创建一个只包含静态方法的类。
在Java中,到处使用类的想法是错误的,甚至只是将不共享任何状态的静态函数组合在一起(因此这些类永远不会被实例化)。
Python在这里求同存异;如果您的函数没有一些共享状态(因此在Java中通常是静态函数),并且与“实”类(即实际实例化的类)没有密切关系,那么您只需在模块内使用自由函数。
这背后的原因是,只有当您真正想要实例化一个类时,才需要它,因此,将一个类作为多个不需要共享实例特定状态的函数的容器是无用的。
实际上,您可以将模块视为静态
类——即函数(=静态方法)、模块变量(=静态字段)和类型的容器。
Python中的一件好事是,拥有顶级函数不会带来全局名称空间污染问题,因为在Python中,顶级函数/对象/。。。仍在模块范围内。因此,您仍然可以按模块对函数进行分组,而无需缴纳不必要的税。
问题内容: 我来自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的魔术单位。它与当前