将实例变量添加到 Python 中的基础 class
Adding an instance variable to a base class in Python
我有一个基础 class A,由 classes B 和 C 继承,我试图从中设置一个实例变量。这样的变量被基础 class A 中的方法使用,如下所示。
class A(object):
def foo(self):
print(self.value)
class B(A):
value = "B"
class C(A):
value = "C"
>>> b = B()
'B'
>>> c = C()
'C'
我知道函数 foo
只会在执行期间进行评估,只要我不直接从 A
的实例调用 foo
就可以了。
然而,我无法理解 value = "B"
和 value = "C"
是如何成为 self.value = "B"
和 self.value = "C"
.
抱歉,如果这是一个幼稚的问题;我已经远离 python 很长一段时间了,真的没有看到任何类似的东西。我正在使用 Python 版本 2.7.12.
您不能将实例变量添加到 Python 中的基础 class,因为实例变量只能添加到实例,而不能添加到 classes。
在您的示例中,"value" 是一个 class 变量。在 Python 中,当没有具有给定名称的实例变量时,它会回退到具有该名称的 class 变量。但是,如果您为 b.value 分配了一个新值,则会在 b 上创建一个实例变量。 B.value 将不受影响,B 的任何新实例也是如此。
我没有找到该行为的权威参考,但这里有一篇关于它的文章。 https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide
我有一个基础 class A,由 classes B 和 C 继承,我试图从中设置一个实例变量。这样的变量被基础 class A 中的方法使用,如下所示。
class A(object):
def foo(self):
print(self.value)
class B(A):
value = "B"
class C(A):
value = "C"
>>> b = B()
'B'
>>> c = C()
'C'
我知道函数 foo
只会在执行期间进行评估,只要我不直接从 A
的实例调用 foo
就可以了。
然而,我无法理解 value = "B"
和 value = "C"
是如何成为 self.value = "B"
和 self.value = "C"
.
抱歉,如果这是一个幼稚的问题;我已经远离 python 很长一段时间了,真的没有看到任何类似的东西。我正在使用 Python 版本 2.7.12.
您不能将实例变量添加到 Python 中的基础 class,因为实例变量只能添加到实例,而不能添加到 classes。
在您的示例中,"value" 是一个 class 变量。在 Python 中,当没有具有给定名称的实例变量时,它会回退到具有该名称的 class 变量。但是,如果您为 b.value 分配了一个新值,则会在 b 上创建一个实例变量。 B.value 将不受影响,B 的任何新实例也是如此。
我没有找到该行为的权威参考,但这里有一篇关于它的文章。 https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide