python中的类变量在尚未赋真值时,是否应该初始化为虚值?

问题描述 投票:0回答:1

我在 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 Afirst 是在 foo2. 这个警告是合理的,这就是为什么我在想初始化 first 到一个虚拟的占位符。

这里的最佳实践是什么?

python class oop class-variables
1个回答
2
投票

我个人认为,写出的代码是非常好的,被工具标记为干净的代码,如 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 (如果你重新命名这个类,需要更改的行数就会减少)

© www.soinside.com 2019 - 2024. All rights reserved.