I'm learning python and just wanted to confront two versions of the same code and ask which approach is better. Basically I have the Reputation class which should be bound to each Warrior object. My intuition tells me it would be the easiest to simply create Reputation instance during initialazing Warrior object. On the other hand it's against dependency injection. I would appreciate any feedback. class Reputation: def __init__(self, reputation): self._reputation = reputation def rank(self): if self._reputation >= 10: return "basic" if self._reputation >= 20: return "mid" if self._reputation >= 30: return "advanced" def set(self, value): if value < 0: raise ValueError("Negative") self._reputation = value def get(self): return self._reputation composition class Warrior: def __init__(self, name: str, reputation: int = 0): self.name = name self._reputation = Reputation(reputation) @property def rank(self): return self._reputation.rank() @property def reputation(self): return self._reputation.get() @reputation.setter def reputation(self, value): self._reputation.set(value) def main(): warrior = Warrior("muah") warrior.reputation += 10 print(warrior.rank) -- basic Or dependency injection: class Warrior: def __init__(self, name: str, reputation: Reputation): self.name = name self._reputation = reputation @property def rank(self): return self._reputation.rank() @property def reputation(self): return self._reputation.get() @reputation.setter def reputation(self, value): self._reputation.set(value) def main(): warrior_reputation = Reputation(reputation=11) warrior = Warrior("muah", reputation=warrior_reputation) warrior.reputation += 10 print(warrior.rank) -- mid Continue reading...