在Python中将实例变量添加到基类

在Python中将实例变量添加到基类,python,oop,inheritance,member,Python,Oop,Inheritance,Member,我有一个基类a,由类B和C继承,我试图从中设置一个实例变量。此类变量由基类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,由类B和C继承,我试图从中设置一个实例变量。此类变量由基类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中不能向基类添加实例变量,因为实例变量只能添加到实例,不能添加到类

在您的示例中,“value”是一个类变量。在Python中,当没有具有给定名称的实例变量时,它会返回到具有该名称的类变量。但是,如果为b.value指定了一个新值,则会在b.value上创建一个实例变量。B.value将不受影响,任何新的B.value实例也不受影响


我没有找到关于这种行为的权威参考,但这里有一篇关于它的文章

它们不是实例变量,它们是从实例访问的类级变量。@juanpa.arrivillaga,但这种访问是否应该通过
value
而不是
self.value
?为什么
self.value
有效?否。
value
在任何范围内都没有定义。这将引发一个
名称错误
。您可以使用
MyClass.value
myu instance.value
,但只要
value
就可以尝试查找局部变量或全局变量。当访问实例上的属性时,它首先检查实例的名称空间,如果找不到,则检查类的名称空间,然后检查MRO中的所有类,直到解析名称或引发
AttributeError
。简而言之,这就是继承。看啊,我真的不知道,当没有具有给定名称的实例变量时,它会返回到具有该名称的类变量。你能推荐一些参考资料吗?这样我就能更好地理解这个默认行为定义了?提前谢谢你。在我的原始帖子之前,我没有找到权威的参考资料,所以我没有收录。我已经更新了我的答案,以包含一篇文章。@Rubens所有详细信息都在中,因此,例如,此代码段:“自定义类类型通常由类定义创建(请参见“类定义”一节)类有一个由dictionary对象实现的命名空间。类属性引用被转换为该字典中的查找,例如,
C.x
被转换为
C.\uu dict\uuu[“x”]
(尽管有许多钩子允许使用其他方法定位属性)。如果在那里找不到属性名称,则在基类中继续进行属性搜索。“