@staticmethod与模块级功能


21

这不是关于@staticmethod@classmethod!我知道如何staticmethod工作。我想知道的是@staticmethod模块级功能的正确用例。

我已经用谷歌搜索了这个问题,似乎已经达成了一些普遍的共识,即模块级函数比静态方法更受青睐,因为它更具Python风格。静态方法具有绑定到其类的优势,如果仅该类使用它,这可能是有道理的。但是,在Python中,功能通常是按模块而非类来组织的,因此通常使它成为模块功能也是有意义的。

静态方法也可以被子类覆盖,这是一个优点或缺点,这取决于您如何看待它。尽管静态方法通常是“功能纯净的”,所以重写它可能并不明智,但有时可能很方便(尽管这可能是“便捷但绝不做”的事情之一,只有经验才能教您。)

是否有使用静态方法或模块级功能的一般经验法则?它们有哪些具体的优点或缺点(例如,将来的扩展,外部扩展,可读性)?如果可能,还提供一个案例。

Answers:


11

从技术上讲,静态方法和模块函数的行为几乎完全相同-在这两种情况下,它们都像标准函数一样工作,区别在于放置它们的名称空间。因此,决策更多是可维护性/可读性之一。

通常,如果满足部分或全部这些条件,我将使用静态方法:

  • 已经存在一个具有常规方法的类
  • 该函数通常与该类的对象有关,但与一个特定实例无关
  • 您希望能够像调用非静态方法一样调用该方法,这可能是因为您将来可能希望在不破坏客户端代码的情况下使该方法成为非静态方法

0

程序是对现实的模拟。这样,这取决于您如何看待现实。

函数代表一些活动。一般活动越多,用功能模拟活动的趋势就越大。方法绑定到类。特定于该类的活动越多,该活动就越容易被一种方法模拟。

考虑三角函数。说,sin()众所周知,您知道它适合角度。您知道它想要一个浮点数作为输入并返回该浮点数。无论如何,可以有一个由类表示的angle数据类型,.sin()而no参数可以是与angle对象一起使用的常规方法,而.sin(x)单个参数可以是该类的静态方法。我敢打赌,更多的人认为做sin()一个简单的函数会更好。他们更习惯了。

另一个观点:模块类似于类实例。它具有自己的成员变量和成员函数。从某种意义上说,它实现了单例模式。只要从应用程序的另一个模块导入它,就可以访问完全相同的变量和函数。


0

我有一个函数,它将对象的深层数据层次结构的一部分作为参数。相反,传递到达数据层次结构那部分所需的几个参数将很麻烦。因此,没有理由引用self或cls。但是该功能将仅用于特定类的对象的一部分。因此,对我来说,这是一个类方法。

此外,我更喜欢导入类名(“从模块导入类”而不是“导入模块”)。将函数包含为静态方法使我可以访问该方法,而将其编写为模块级函数则需要不同的导入。


2
如果我是你,我将避免第一人称回答。令人困惑。您应该改用第二个人的身份向要求者写信。
亚伦·霍尔

也许。我在提供一个示例用例,该用例可能与发问者的想法相匹配,也可能不匹配。
DVD Avins
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.