静态变量应该继承吗

should inheritance work for static variable

我不确定这个问题是否正确,可能是继承仅在实例中有效。

我提供了下面的代码,我们在其中计算使用 python 基于描述符的方法创建了多少 X 实例,其中 X 正在修改继承的静态变量。

class X:
    def __set_name__(self, owner, name):
        owner.howManyX.append(name)


class Base:
    howManyX = []


class A(Base):
    a1 = X()
    a2 = X()
        

class B(Base):
    b1 = X()
    b2 = X()


print(id(A.howManyX), A.howManyX )
print(id(B.howManyX), B.howManyX)
print(id(Base.howManyX), Base.howManyX)

因为ABclass都应该继承Baseclass howManyX。但是输出有点出乎意料,因为下面显示的变量似乎相同。

139852096097856 ['a1', 'a2', 'b1', 'b2']
139852096097856 ['a1', 'a2', 'b1', 'b2']
139852096097856 ['a1', 'a2', 'b1', 'b2']

这个继承。 ABBase 继承了 相同的属性 并改变了它所指的对象。

你想要继承的反面,你想要在每个子class中覆盖 howManyX = [],所以每个class获取它的 自己的属性 引用不同的对象。

注意,您使用实例得到完全相同的行为

>>> class Foo:
...     bar = []
...
>>> foo1 = Foo()
>>> foo2 = Foo()
>>> foo1.bar.append('baz')
>>> foo2.bar.append('bing')
>>> Foo.bar is foo1.bar is foo2.bar
True
>>> Foo.bar, foo1.bar, foo2.bar
(['baz', 'bing'], ['baz', 'bing'], ['baz', 'bing'])

Python 中的所有继承意味着当您查找某些属性时,some_obj.some_attribute,您在继承的名称空间中查找该属性。所以如果在some_obj中查找.some_attribute,没有找到,那么,class命名空间,以及方法解析顺序中的所有classes都会被查询(按顺序)。

如果 some_obj 本身就是一个 class,则跳过任何实例查找,直接前往 class 命名空间和方法解析顺序中的命名空间。