如何在派生的 class 中正确访问和设置 class 变量?

How to properly access and set class variables in a derived class?

假设您有一个 python class(例如 B),它是其他 class(例如 [=15] 的派生 class =]) 并且 class A 具有 class 变量和 @classmethods 可以帮助您更改或查看这些 class 变量。我假设 class A 中的 @classmethod 使用语法 cls.variable_name = value 设置 class A class 变量会起作用.

这似乎有时有效,但并非总是如此,这让我很困惑。下面是一个没有像我期望的那样设置 class 变量的示例。因此我不知道 cls.something 将访问什么,所以我必须使用 A.something,这似乎我将在 @classmethods 中缺少 cls.something 的功能。 cls.something 在 class 方法中实际访问了什么?为什么下面的示例没有设置 test class class 变量?

以下带有输出的示例有望证明我的意思:

class Test():
    epf = 'A'

    @classmethod
    def set_formats(cls, p):
        cls.epf = p

    @classmethod
    def form(cls):
        return cls.epf

class Mytest(Test):
        pass

这是输出:

>>>c=Mytest
>>>Test.form()
'A'

>>>c.set_formats(p='a')
>>>Test.epf
'A'

>>>c.form()
'a'

>>>c.epf
'a'

所以在这个例子中,class方法没有像我期望的那样改变 class 变量,而是出现了一个实例变量。如果我在没有派生 class 的情况下执行上述操作,那么它会按预期工作。唔?显然这里遗漏了什么!

现在,如果我将 c.set_formats(p='a', f='A') 更改为 Test.set_formats(p='a', f='A'),它就会起作用。是因为c.set_formats使用了class方法,cls是一个实例吗?

编辑: 使代码更小并根据要求更改约定。

Is it because c.set_formats uses the class method with cls being an instance?

是的,您可以通过显示相关对象 ID 的打印调用进行检查。