当尚未分配实值时,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

注意::在unresolved attribute reference 'first' for class A中访问first时,IDE会警告foo2。该警告是合理的,这就是为什么我正在考虑将first初始化为虚拟占位符的原因。

这里的最佳做法是什么?

iCMS 回答:当尚未分配实值时,python应该将类变量初始化为虚拟值吗?

我个人认为编写代码非常好,可以使用flakeflake8prospectorpylint等工具将其标记为干净的代码,也可以使用您的IDE使用的任何工具。

在某些情况下,这意味着不必严格地编写代码行,或者只是为了使用工具以完全不同的方式重写代码。 我认为主要是值得的。

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

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

另一条评论:

尽管

class A:
    ...

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

有效,有点奇怪。

@staticmethod适用于既不需要任何类属性也不需要类实例的函数,但是您可以对A

explicit 引用

更常见的是写:

class A:
    ...

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

@classmethod表示您要访问类成员或其他类方法,但是您不需要实例。所以正是您想要实现的目标。

还有一个优点,那就是如果您创建一个继承自A的类,那么问题就更少了(如果您重命名该类,那么更改的行数也就更少了)

本文链接:https://www.f2er.com/2187898.html

大家都在问