<p>我不确定在这种情况下使用继承是最好的(至少在“重新分类”方面)。看起来你走对了,但听起来组合或聚合是最好的选择。下面是我正在考虑的一个例子(在未经测试的伪代码中):</p>
<pre><code>from copy import copy
# As long as none of these attributes are defined in the base class,
# this should be safe
class SkilledProgrammer(Programmer):
def __init__(self, *skillsets):
super(SkilledProgrammer, self).__init__()
self.skillsets = set(skillsets)
def teach(programmer, other_programmer):
"""If other_programmer has skillsets, append this programmer's
skillsets. Otherwise, create a new skillset that is a copy
of this programmer's"""
if hasattr(other_programmer, skillsets) and other_programmer.skillsets:
other_programmer.skillsets.union(programmer.skillsets)
else:
other_programmer.skillsets = copy(programmer.skillsets)
def has_skill(programmer, skill):
for skillset in programmer.skillsets:
if skill in skillset.skills
return True
return False
def has_skillset(programmer, skillset):
return skillset in programmer.skillsets
class SkillSet(object):
def __init__(self, *skills):
self.skills = set(skills)
C = SkillSet("malloc","free","pointer arithmetic","curly braces")
SQL = SkillSet("SELECT", "INSERT", "DELETE", "UPDATE")
Bob = SkilledProgrammer(C)
Jill = Programmer()
teach(Bob, Jill) #teaches Jill C
has_skill(Jill, "malloc") #should return True
has_skillset(Jill, SQL) #should return False
</code></pre>
<p>如果您不熟悉<a href="http://docs.python.org/library/stdtypes.html#set" rel="noreferrer">sets</a>和<a href="http://docs.python.org/tutorial/controlflow.html#arbitrary-argument-lists" rel="noreferrer">arbitrary argument lists</a>以获取此示例,则可能需要阅读更多有关它们的信息。</p>