<p>看起来<a href="https://docs.python.org/2/library/copy.html" rel="nofollow">^{<cd1>}</a>可以帮你。在</p>
<pre><code>import copy
class Parent(object):
def __init__(self, a):
self.a = a
def copy(self):
return copy.deepcopy(self)
class Child(Parent):
def __init__(self, a, b):
super(Child, self).__init__(a)
self.b = b
</code></pre>
<p>copy方法将携带<code>self</code>是什么的类(不一定是父类)。例如:</p>
^{pr2}$
<p>这似乎是你的主要目标。然而,在如何构建测试结构方面也值得付出一些努力。我使用您的示例代码实现了一个不同的解决方案,它允许您继承测试。请注意,需要向病毒传递一个关键字参数列表(<code>**kwargs</code>)。下面给出了用法示例。在</p>
<pre><code>import copy, random
class SimpleVirus(object):
def __init__(self, max_birth_prob, clear_prob):
self.max_birth_prob = max_birth_prob
self.clear_prob = clear_prob
self._tests = [self.simple_test]
def copy(self):
return copy.deepcopy(self)
def simple_test(self, **kwargs):
return random.random() < self.max_birth_prob * (1 - kwargs['pop_density'])
def reproduce(self, **kwargs):
if all(test(**kwargs) for test in self._tests):
return self.copy()
raise Exception
class ResistantVirus(SimpleVirus):
def __init__(self, max_birth_prob, clear_prob, resistances, mut_prob):
super(ResistantVirus, self).__init__(max_birth_prob, clear_prob)
self.resistances = resistances
self.mut_prob = mut_prob
self._tests.append(self.resistance_test)
def resistance_test(self, **kwargs):
return all(drug in self.resistances for drug in kwargs['drug_list'])
</code></pre>
<p>下面的内容有时会复制,有时会引发<code>Exception</code>。在</p>
<pre><code>res_virus = ResistantVirus(0.8, 0.2, ['a', 'b', 'c'], 0.1)
res_virus.reproduce(pop_density=0.3, drug_list=['a', 'b'])
</code></pre>
<p>请注意,这两个类之间没有显著的代码重用。如果你有一个严格的继承链,并且事情会随着你的发展而“积累”,这是很好的。但是,如果有很多类都继承<code>SimpleVirus</code>,并且其中一些类共享功能,那么值得研究一下<a href="https://en.wikipedia.org/wiki/Composition_over_inheritance" rel="nofollow">object composition over inheritance</a>。在</p>