我有一个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
是否有更好的模式?
_x
的地方正确进行计算即可。 - Marcintype(self)
来获取类。如果你对它进行子类化,那么你将在子类上设置属性,当然,这可能是你想要的。 - kindall