<p>这可能太离谱了,但我认为不需要单独的<code>DogHabits</code>类<code>habits</code>应该是类属性,而不是实例属性,并且可以由<code>__init_subclass__</code>设置</p>
<pre><code>class Dog:
habits = ['lick butts']
def __init_subclass__(cls, habits=None, **kwargs):
super().__init_subclass__(**kwargs)
if habits is not None:
cls.habits = cls.habits + habits
class GermanShepherd(Dog, habits=['herd sheep']):
def __init__(self):
self.type = 'german shepherd'
class Labrador(Dog, habits=['pee on owner']):
def __init__(self):
self.type = 'labrador'
</code></pre>
<p><code>type</code>本身更像是类属性而不是实例属性,因为它只是类本身已经编码的信息的(替代)字符串表示。由于您不会附加到现有值,因此在必要时设置class属性比通过<code>__init_subclass</code>更容易:</p>
<pre><code>class Dog:
habits = ['lick butts']
type = 'generic_dog'
def __init_subclass__(cls, habits=None, **kwargs):
super().__init_subclass__(**kwargs)
if habits is not None:
cls.habits = cls.habits + habits
class GermanShepherd(Dog, habits=['herd sheep']):
type = 'german shepard'
class Labrador(Dog, habits=['pee on owner']):
type = 'labrador'
class BlackLabrador(Labrador):
pass # E.g. if you are happy with inheriting Labrador.type
</code></pre>