Как сказано в комментариях: то, что вы хотите, называется классом "mixin".
Обычное соглашение об именах для такого класса заключается в том, что он заканчивается на "mixin", например:
class HealerMixin:
def __init__(self, *args, **kwargs):
if type(self) is HealerMixin:
raise TypeError("HealerMixin cannot be instantiated")
super().__init__(*args, **kwargs)
def heal(self, target=None):
if target is None:
# heal self
target = self.name
self.cover() # this is ugly
print('healing {!s}'.format(target))
class NameMixin:
def __init__(self, name, *args, **kwargs):
if type(self) is NameMixin:
raise TypeError("NameMixin cannot be instantiated")
self.name = str(name)
super().__init__(*args, **kwargs)
def __str__(self):
return self.name
Если вы включаете метод __init__
в свой миксин, обычно хорошей идеей является включение сигнатуры (*args, **kwargs)
в метод __init__
, поскольку это позволяет микшину работать с любым дочерним классом с любымsignature.
class Wizard(NameMixin):
def cover(self):
print('{!s} Covering behind my robe'.format(self.name))
class Druid(HealerMixin, Wizard):
pass
class FlashyDruid(Druid):
def __init__(self, name):
super().__init__("~~***{!s}***~~".format(name))
def cover(self):
"""Overrides Wizard.cover()"""
print('{!s} Covering behind my glittering robe'.format(self.name))
Возможно, используйте это так:
>>> Gob = FlashyDruid("Gob")
>>> Gob.cover()
~~***Gob***~~ Covering behind my glittering robe
>>> Buster = Druid("Buster")
>>> Buster.heal(Gob)
Buster Covering behind my robe
healing ~~***Gob***~~
Использование super
в вашем методе __init__
делает так, что наследование классов происходит автоматически.Вам не нужно самостоятельно продумывать наследование самостоятельно.
Обратите внимание, что иногда становится важным наследовать класс mixin в правильном порядке : сначала идут mixins, а потом базовые классы (еслиесть такие)Если вы этого не сделаете, вы будете вызывать ошибки.Например, в некоторых случаях миксин будет пытаться посылать аргументы классам, которые не знают, что с ними делать.