静态变量应该继承吗
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)
因为A和Bclass都应该继承Baseclass howManyX
。但是输出有点出乎意料,因为下面显示的变量似乎相同。
139852096097856 ['a1', 'a2', 'b1', 'b2']
139852096097856 ['a1', 'a2', 'b1', 'b2']
139852096097856 ['a1', 'a2', 'b1', 'b2']
这个是继承。 A
和 B
从 Base
继承了 相同的属性 并改变了它所指的对象。
你想要继承的反面,你想要在每个子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 命名空间和方法解析顺序中的命名空间。
我不确定这个问题是否正确,可能是继承仅在实例中有效。
我提供了下面的代码,我们在其中计算使用 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)
因为A和Bclass都应该继承Baseclass howManyX
。但是输出有点出乎意料,因为下面显示的变量似乎相同。
139852096097856 ['a1', 'a2', 'b1', 'b2']
139852096097856 ['a1', 'a2', 'b1', 'b2']
139852096097856 ['a1', 'a2', 'b1', 'b2']
这个是继承。 A
和 B
从 Base
继承了 相同的属性 并改变了它所指的对象。
你想要继承的反面,你想要在每个子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 命名空间和方法解析顺序中的命名空间。