[Python] Python dependency injection vs composition?

Discussão em 'Python' iniciado por Stack, Dezembro 31, 2024.

  1. Stack

    Stack Membro Participativo

    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...

Compartilhe esta Página