Вот простой способ реализации наследования с использованием super()
. Чтобы это работало, вам всегда нужно создавать экземпляры Player
(и другие классы, которые наследуются от ваших *** способных классов) с аргументами ключевых слов. Каждый базовый класс обрезает любые аргументы ключевого слова, которые он использует, из kwargs
и передает остаток следующему __init__()
в mro, например:
class Collidable(object):
def handle_collision(other, incident_vector):
pass
def __init__(self, shape, **kwargs):
self.shape = shape
super(Collidable, self).__init__(**kwargs)
class Movable(object):
def update_position(self):
self.velocity += self.acceleration
self.position += self.velocity
def __init__(self, velocity, acceleration, **kwargs):
self.velocity, self.acceleration = velocity, acceleration
super(Movable, self).__init__(**kwargs)
class Drawable(object):
def draw(self):
pass
def __init__(self, image, **kwargs):
self.image = image
super(Drawable, self).__init__(**kwargs)
class Controllable(object):
def key_down(self, key):
pass
def __init__(self, **kwargs):
super(Controllable, self).__init__(**kwargs)
Тогда вы можете определить свой Player
класс:
class Player(Collidable, Movable, Drawable, Controllable):
pass
И используйте это так:
>>> p = Player(shape='circle', velocity=0.0, acceleration=1.0, image='player.png')
>>> p.shape
'circle'
>>> p.velocity
0.0
>>> p.acceleration
1.0
Если вам нужны дополнительные переменные экземпляра для класса Player
, вы должны определить __init__()
аналогично другим классам, например:
class Player(Collidable, Movable, Drawable, Controllable):
def __init__(name, **kwargs):
self.name = name
super(Player, self).__init__(**kwargs)