我在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
初始化为虚拟占位符的原因。
这里的最佳实践是什么?
我个人认为编写代码非常好,这些代码被flake
、flake8
、prospector
、pylint
等工具或您的 IDE 正在使用的任何工具标记干净。
在某些情况下,这意味着编写并非绝对必要的行,或者只是为了取悦工具而以略有不同的方式重写代码。 我认为大多数情况下这是值得的。
在大多数情况下,它有助于避免难以阅读的代码或奇怪的错误。 这意味着,即使不是绝对必要的,最好使用虚拟值显式声明一个类变量,即使稍后将设置实际值。
阅读你的代码的人会更容易看到你有类变量。
另一条评论:
虽然
class A:
...
@staticmethod
def foo():
A.first = 20
作品,有点奇怪。
@staticmethod
适用于不需要任何类属性或类实例的函数,但您随后具有对A
的显式引用
更常见的是写:
class A:
...
@classmethod
def foo(cls):
cls.first = 20
@classmethod
指示您希望访问类成员或其他类方法,但不需要实例。所以正是你试图实现的目标。
这也有一个优点,如果你创建一个从A
继承的类,问题就会更少(如果你重命名这个类,要更改的行就会更少(