问题描述
假设您有一个 python 类(比如 B
),它是某个其他类(比如 A
)的派生类,并且该类 A
具有类变量和 {{ 1}} 帮助您更改或查看这些类变量。我曾假设类 @classmethods
中的 @classmethod
使用语法 A
设置类 A
类变量会起作用。
这似乎有时有效,但并非总是如此,这让我感到困惑。下面是一个没有像我期望的那样设置类变量的例子。因此,我无法确定 cls.variable_name = value
将访问什么,因此我必须使用 cls.something
,这似乎我将错过 A.something
中 cls.something
的功能。 @classmethods
在类方法中实际访问什么?为什么下面的示例没有设置 cls.something
类的类变量?
以下带有输出的示例希望能说明我的意思:
test
输出如下:
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'
更改为 c.set_formats(p='a',f='A')
,它确实有效。是因为 Test.set_formats(p='a',f='A')
使用类方法,c.set_formats
是一个实例吗?
编辑:使代码更小,并根据要求更改了约定。
解决方法
是不是因为 c.set_formats
使用类方法,cls
是一个实例?
是的,您可以通过显示相关对象 ID 的打印调用进行检查。