Bonjour,

Je travail sur un projet en python dans lequel un auteur peut créer des titres de livres qui seront ajoutés à sa collection. Un client peut acheter les livres en fonction du titre et du stock. Je ne comprend pas pourquoi la variable stock ne renvoie aucune valeur. Pouvez-vous m'éclairer svp ? Smiley sweatdrop


class Personne:
    def __init__(self, nom, prenom):
        self.nom = nom
        self.prenom = prenom
    
    @classmethod
    def sePresenter(self):
        nom = input('Entrez votre nom : \n')
        prenom = input('Entrez votre prénom :\n')
        return self(nom, prenom)

    def set_nom(self, nom):
        self.nom = nom

    def get_nom(self, nom):
        return self.nom

    def set_prenom(self, prenom):
        self.prenom = prenom

    def get_prenom(self, prenom):
        return self.prenom

class Auteur(Personne):
    def __init__(self, nom, prenom, stock):
        super().__init__(nom, prenom)
        self.oeuvre = []
        self.stock = stock

    def listerOeuvre(self):
        for i in self.oeuvre:
            print(i)

    def set_oeuvre(self, oeuvre):
        self.oeuvre = oeuvre

    def get_oeuvre(self, oeuvre):
        return self.oeuvre

    def ecrireUnLivre(self):
        number = input('[->Créer un/des livre(s)] Entrez le nombre de livre\n')
    
        for i in range(1, int(number)+ 1, 1):
            _titre = input('[->Livre n°' + str(i) + '] Insérez un titre :\n')
            self.stock = input('[Stock] : ')
            self.oeuvre.append(_titre)

        return Livre(_titre, self.stock, self.nom, self.prenom)

class Livre(Auteur):
    def __init__(self, _titre, nom, prenom, stock):
        super().__init__(nom, prenom)
        self._titre = _titre
        self.stock = stock

    def print(self):
        print(self.get_titre())

    def set_titre(self, _titre):
        self._titre = _titre

    def get_titre(self):
        return self._titre

class Client(Personne):
    def __init__(self, nom, prenom):
        super().__init__(nom, prenom)

class Bibliotheque(Auteur, Client):
    def __init__(self, nom, oeuvre, stock):
        super().__init__(nom, oeuvre, stock)
        self.oeuvre = oeuvre
        self.stock = stock

    def inventaire(self):
        for i in self.oeuvre:
            print(i, '[Stock] :', self.stock)
        return self.stock

    def acheterUnLivre(self, auteur, catalogue):
        titre = input('[->Acheter un livre] Insérez le titre du livre \n')
        stock = Bibliotheque.inventaire
        for i in range(len(catalogue)):
            if titre == catalogue[i]:
                """ nb = input('Combien en voulez-vous ? \n') """
                print(self.stock)
                """ if int(self.stock) >= int(nb):
                    print('[->Bon] Votre commande a été envoyée !') """
        

def start_engine():
    auteur1 = Auteur.sePresenter()
    auteur1.ecrireUnLivre()
    client = Client.sePresenter()
    Bibliotheque.acheterUnLivre(auteur = auteur1, catalogue = ['polar', 'test1', 'test2'])    
    
if __name__ == "__main__":
    start_engine()

Modifié par BaldFox (22 Apr 2022 - 18:47)
Modérateur
Hello,

As-tu testé tes class au fur et à mesure ?
Je vois que des incohérences qui vont à l'encontre même de la poo. Ça part dans tous les sens. J'ai commencé à déboguer ton code et j'avoue qu'il y a tellement de choses à revoir

- Cette propriété stock qui se balade (qui aura pour effet de multiples bugs, puisqu'elle est freestyle)
- Un livre ne peut pas hériter d'un auteur. Un livre A comme attribut un auteur
- quel est l'intérêt de la class Client ?
- Tu utilises des methodes de class qui n'ont rien à faire là :
1. Tu ne peux pas avoir self
2. Tel que tu l'as écrite, ce n'est pas du tout bon : La fonction classmethod() est une fonction intégrée en Python, qui renvoie une méthode de classe pour une fonction donnée. Ce qui veut dire que tu confonds staticmethod et classmethod. D'ailleurs, pour le moment, tu n'as pas besoin de l'utilisation d'une méthode static
- Tu utilises super() sans savoir comment l'écrire correctement.
- Je ne vois pas de dunder method. Or à certains endroits, ce serait pertinent de les utiliser. En plus, tu aurais une écriture plus pythonique avec des comportements adéquats suivant tes "objets".
- ce n'est pas parce que tu écris "class" que tu sais faire de la poo. Loin de là. Il y a toute une philosophie de développement.
Modifié par niuxe (24 Apr 2022 - 17:20)
Meilleure solution
Bonjour niuxe,

Merci pour ton analyse. J'ai finalement retravaillé les relations entre 2 classes; la structuration d'un code python et l'utilité des décorateurs. Après plusieurs recherches j'ai compris le sens de "ca part dans tous les sens" c'est littéralement ça, j'ai dû tout refaire.

Bonne journée,
Cdlt

niuxe a écrit :
Hello,

As-tu testé tes class au fur et à mesure ?
Je vois que des incohérences qui vont à l'encontre même de la poo. Ça part dans tous les sens. J'ai commencé à déboguer ton code et j'avoue qu'il y a tellement de choses à revoir

- Cette propriété stock qui se balade (qui aura pour effet de multiples bugs, puisqu'elle est freestyle)
- Un livre ne peut pas hériter d'un auteur. Un livre A comme attribut un auteur
- quel est l'intérêt de la class Client ?
- Tu utilises des methodes de class qui n'ont rien à faire là :
1. Tu ne peux pas avoir self
2. Tel que tu l'as écrite, ce n'est pas du tout bon : La fonction classmethod() est une fonction intégrée en Python, qui renvoie une méthode de classe pour une fonction donnée. Ce qui veut dire que tu confonds staticmethod et classmethod. D'ailleurs, pour le moment, tu n'as pas besoin de l'utilisation d'une méthode static
- Tu utilises super() sans savoir comment l'écrire correctement.
- Je ne vois pas de dunder method. Or à certains endroits, ce serait pertinent de les utiliser. En plus, tu aurais une écriture plus pythonique avec des comportements adéquats suivant tes "objets".
- ce n'est pas parce que tu écris "class" que tu sais faire de la poo. Loin de là. Il y a toute une philosophie de développement.

Modifié par BaldFox (26 Apr 2022 - 17:21)