我在 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
NOTE: IDE给出了一个警告 unresolved attribute reference 'first' for class A
当 first
是在 foo2
. 这个警告是合理的,这就是为什么我在想初始化 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
(如果你重新命名这个类,需要更改的行数就会减少)