|
|
|
|
|
by Walkman
4359 days ago
|
|
With interfaces, the above example would look like this: from abc import ABCMeta
class PhysicsobjectMixin(ABCMeta):
@abstractmethod
def update_physics(self):
pass
@abstractmethod
def apply_konckback(self, force):
pass
@abstractmethod
def get_position(self):
pass
class FightMixin(ABCMeta):
@abstractmethod
def attack(self):
pass
@abstractmethod
def defend(self):
pass
class TalkMixin(ABCMeta):
@abstractmethod
def say_something(self):
pass
class Character(PhysicsobjectMixin, FightMixin, TalkMixin):
def update_physics(self):
pass
def apply_konckback(self, force):
pass
def get_position(self):
pass
def attack(self):
pass
def defend(self):
pass
def say_something(self):
pass
class Pickup(PhysicsobjectMixin):
def update_physics(self):
pass
def apply_konckback(self, force):
pass
def get_position(self):
pass
class Projectile(PhysicsobjectMixin):
def update_physics(self):
pass
def apply_konckback(self, force):
pass
def get_position(self):
pass
This is not DRY at all. I like mixins much better. |
|
For example, what if you want to add custom animations any time your `Character` takes an action? Suddenly, all that boilerplate you "abstracted" away through mix-ins is back, with a vengeance. How about if your physics for a `Projectile` are different than for a `Pickup`? What if your character suddenly picks up a Sling of Thrown Voices, and needs to apply conversation snippets to its projectiles?
In simple examples, mixins are great and reduce a lot of boilerplate, but in reality they are rarely so clean.