gpt4 book ai didi

python - 多继承python类中的类变量

转载 作者:行者123 更新时间:2023-11-28 21:55:16 25 4
gpt4 key购买 nike

我有一个 Base 类,其中存储了一些基本方法、属性等,我有一个 Mixin,我想在其中共享一个或多个Base 的更多子类。像这样:

class Base(object): pass

class Mixin(object):
# IMPORTANT: cache _x locally on Mixin to only compute for all subclasses
_x = None

@property
def x(self):
if self._x is None:
print 'reset _x'
self._x = 2
return self._x

class A(Base, Mixin): pass
class B(Base, Mixin): pass

重要的是,我想在 Mixin 上缓存 _x 变量,这样它在所有子类 A 中只计算一次, B等---计算这个值需要很长时间。奇怪的是,这似乎并没有像我在 python 中预期的那样工作:

a = A()
b = B()
print 'calling a.x'
a.x
print 'calling a.x'
a.x
print 'calling b.x'
b.x
print 'calling b.x'
b.x

这会打印出 reset _x 两次 --- 一次是第一次调用 a.x,这是我预期的,另一次是第一次调用 b.x,这是我没有预料到的。我对 python 类属性的理解是它们在每个类的基础上存储一次。谁能解释一下这是怎么回事?

Mixin 上本地缓存 _x 是否有更好的模式?

最佳答案

您的问题是您引用了 self._x。这是一个实例属性,即它对于每个实例都是不同的。如果您还没有设置 self._x,那么 Python 将使用在继承层次结构中的类中找到的第一个 _x(这将是 _x 在你的 Mixin 类上),但是一旦你设置了 self._x 然后 _x 总是会在那个实例上找到.在新实例上,不会设置该属性,因此将使用 Mixin._x,但它始终为 None,因为您永远不会更改它。

因此,您想在任何有 self._x 的地方使用 Mixin._x,但尤其是设置该属性时。

关于python - 多继承python类中的类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22974016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com