L'héritage avec la méthode dataclass
Bonjour,
Dans le code ci-dessous, dans la classe Junior, est-ce-que de mettre (str, str) comme argument est juste ou faut il plutot mettre ("nom", "prenom")?
Les deux fonctionnent mais je me demandais quelle est la convention à suivre.
from dataclasses import dataclass
projets = ["pr_GameOfThrones", "HarryPotter", "pr_Batman"]
@dataclass
class User:
nom : str
prenom : str
def __str__(self):
return f"Utilisateur {self.nom} {self.prenom}"
def project(self):
for projet in projets:
print(projet)
@dataclass
class Junior(User):
User(str,str)
Hello,
selon moi ta classe fille ne fait rien c'est pour ça que cela fonctionne. Tu vois que si tu remplaces par ce code, ça fonctionne aussi:
In [12]: from dataclasses import dataclass
...:
...: projets = ["pr_GameOfThrones", "HarryPotter", "pr_Batman"]
...:
...:
...: @dataclass
...: class User:
...: nom: str
...: prenom: str
...:
...:
...: def __str__(self):
...: return f"Utilisateur {self.nom} {self.prenom}"
...:
...:
...: def project(self):
...: for projet in projets:
...: print(projet)
...:
...:
...: @dataclass
...: class Junior(User):
...: pass
In [13]: user = Junior("Dupond", "Michel")
In [14]: user.nom
Out[14]: 'Dupond'
In [15]: user.prenom
Out[15]: 'Michel'
In [16]: user
Out[16]: Junior(nom='Dupond', prenom='Michel')
si tu veux définir un nouvel attribut dans la class Junior, il faut la définir comme tu le ferais dans la classe mère:
In [26]: from dataclasses import dataclass
...:
...: projets = ["pr_GameOfThrones", "HarryPotter", "pr_Batman"]
...:
...:
...: @dataclass
...: class User:
...: nom: str
...: prenom: str
...:
...:
...: def __str__(self):
...: return f"Utilisateur {self.nom} {self.prenom}"
...:
...:
...: def project(self):
...: for projet in projets:
...: print(projet)
...:
...:
...: @dataclass
...: class Junior(User):
...: anciennete: int
In [18]: user = Junior("Dupond", "Michel", 3)
In [19]: user
Out[19]: Junior(nom='Dupond', prenom='Michel', anciennete=3)
Ce que tu as fait dans le code que tu montres c'est ça en fait:
In [22]: test_user = User(str, str)
In [23]: test_user
Out[23]: User(nom=<class 'str'>, prenom=<class 'str'>)
tu initialises avec une instance de la classe User avec comme nom et prénom la classe 'sur', ce qui je pense n'est pas ce que tu cherches à faire. Tu peux t'en convaincre en faisant :
dir(test_user.nom)
['__add__',
'__class__',
'__contains__',
'__delattr__',
'__dir__',
'__doc__',
'__eq__',
...
...
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'capitalize',
'casefold',
'center',
'count',
'encode',
'endswith',
'expandtabs',
'find',
'format',
'format_map',
'index',
'isalnum',
'isalpha',
'isascii',
'isdecimal',
'isdigit',
'isidentifier',
'islower',
'isnumeric',
'isprintable',
'isspace',
'istitle',
'isupper',
'join',
'ljust',
'lower',
'lstrip',
'maketrans',
'partition',
'removeprefix',
'removesuffix',
'replace',
'rfind',
'rindex',
'rjust',
'rpartition',
'rsplit',
'rstrip',
'split',
'splitlines',
'startswith',
'strip',
'swapcase',
'title',
'translate',
'upper',
'zfill']
tu verras que tu vas voir toutes les méthodes de la classe 'str'.
Alors tu n'as pas de message d'erreur car avec les dataclass tu utilises les annotations qui ne génèrent pas d'erreur. Dans ta première classe tu définis 'nom' comme étant une instance de la classe 'str' donc normalement tu dois lui donner un string et non une classe (ici tu lui donnes la classe 'str' ce qui est différent).
J'espère que c'est clair pour toi.
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte