如何在派生的 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 的打印调用进行检查。
假设您有一个 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 withcls
being an instance?
是的,您可以通过显示相关对象 ID 的打印调用进行检查。