【发布时间】:2020-09-26 00:45:10
【问题描述】:
我在 python 中有一个主要是静态方法的类。这些静态方法为类变量分配一些值,如下所示:
class A:
@staticmethod
def foo():
A.first = 20
@staticmethod
def foo2():
return A.first **2
在我的情况下,foo2 将始终在 foo 之后运行。我的问题是我应该将first 初始化为类范围内的某个虚拟值,例如:
class A:
A.first = None
@staticmethod
def foo():
A.first = 20
@staticmethod
def foo2():
return A.first **2
注意:当在foo2 中访问first 时,IDE 会发出unresolved attribute reference 'first' for class A 的警告。这个警告是合理的,这就是为什么我想将first 初始化为一个虚拟占位符。
这里的最佳做法是什么?
【问题讨论】:
-
“我在 python 中有一个主要是静态方法的类。这些静态方法为类变量分配一些值,如下所示:”这没有任何意义。为什么不使用实例变量?此外,如果您要修改类状态,您可能应该使用
classmethods 而不是 staticmethods。但从根本上说,“python 中的一个主要是静态方法的类”是主要的代码气味。 -
我同意先初始化它(就像你的第二个代码一样)。您可能不应该相信
foo2会调用foo并插入assert A.first is not None。 Disclamer:我还假设您展示的是一个相当简化的示例,因为正如上面的评论所述,这个示例本身就是糟糕的设计。 -
那么静态方法的意义何在?我知道我不会有这个类的多个实例。那么为什么不制作静态方法呢? (其实其他编程语言也有静态类之类的东西)
-
关于
@static与@class方法和 代码气味 与否:如果你有一个只有@staticmethods@classmethods 和类变量的类,那么这是创建名称空间的一种方式。您可以使用单独的模块实现相同的目的。我真的不能说,这是不好的做法还是好的做法。以及使用单独的模块是否更好。我认为这是一种可能的编码方式,尽管我主要使用模块 -
@user7331538 静态方法的存在主要是为了安抚来自像 Java 这样的语言的人,其中一切都是类定义。 Python 中代码组织的基本单位是模块,而不是类。如果您打算用另一种语言创建一个静态类,那么在 Python 中,应该只是一个包含常规函数的模块。如果您在该模块中有可变的全局状态,那么您应该使用实例来以开头。
标签: python class oop class-variables