Python 当尚未分配实际值时,是否应该将类变量初始化为虚拟值?



我在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初始化为虚拟占位符的原因。

这里的最佳实践是什么?

我个人认为编写代码非常好,这些代码被flakeflake8prospectorpylint等工具或您的 IDE 正在使用的任何工具标记干净。

在某些情况下,这意味着编写并非绝对必要的行,或者只是为了取悦工具而以略有不同的方式重写代码。 我认为大多数情况下这是值得的。

在大多数情况下,它有助于避免难以阅读的代码或奇怪的错误。 这意味着,即使不是绝对必要的,最好使用虚拟值显式声明一个类变量,即使稍后将设置实际值。

阅读你的代码的人会更容易看到你有类变量。

另一条评论:

虽然

class A:
...
@staticmethod
def foo():
A.first = 20

作品,有点奇怪。

@staticmethod适用于不需要任何类属性或类实例的函数,但您随后具有对A显式引用

更常见的是写:

class A:
...
@classmethod
def foo(cls):
cls.first = 20

@classmethod指示您希望访问类成员或其他类方法,但不需要实例。所以正是你试图实现的目标。

这也有一个优点,如果你创建一个从A继承的类,问题就会更少(如果你重命名这个类,要更改的行就会更少(

最新更新