<p>我认为您可以使用下面显示的mixin <code>PropertyOverrideMixin</code>来完成所需的操作,如果某些属性值不可用,那么它将查找前缀为<code>temp_</code>的相同属性。这将允许您提供临时值,当无法查找实际属性值时可以使用这些值。在</p>
<p>下面是mixin,一些示例模型和一个单元测试来展示它是如何工作的。希望这能适应你的问题!最后值得一提的是,这里的属性可以与普通的对象属性互换,并且仍然可以正常工作。在</p>
<pre><code>from unittest import TestCase
class PropertyOverrideMixin(object):
def __getattribute__(self, name):
"""
Override that, if an attribute isn't found on the object, then it instead
looks for the same attribute prefixed with 'temp_' and tries to return
that value.
"""
try:
return object.__getattribute__(self, name)
except AttributeError:
temp_name = 'temp_{0}'.format(name)
return object.__getattribute__(self, temp_name)
class ParentModel(object):
attribute_1 = 'parent value 1'
class Model(PropertyOverrideMixin):
# Set our temporary property values
@property
def temp_attribute_1(self):
return 'temporary value 1'
@property
def temp_attribute_2(self):
return 'temporary value 2'
# Attribute 1 looks up value on its parent
@property
def attribute_1(self):
return self.parent.attribute_1
# Attribute 2 looks up a value on this object
@property
def attribute_2(self):
return self.some_other_attribute
class PropertyOverrideMixinTest(TestCase):
def test_attributes(self):
model = Model()
# Looking up attributes 1 and 2 returns the temp versions at first
self.assertEquals('temporary value 1', model.attribute_1)
self.assertEquals('temporary value 2', model.attribute_2)
# Now we set the parent, and lookup of attribute 1 works on the parent
model.parent = ParentModel()
self.assertEquals('parent value 1', model.attribute_1)
# now we set attribute_2, so this gets returned and the temporary ignored
model.some_other_attribute = 'value 2'
self.assertEquals('value 2', model.attribute_2)
</code></pre>