On pourrait les définir dans la méthode __init__, mais on aurait un problème de qui définir en premier par exemple si deux personnages sont les meilleures amis l'un de l'autre: vous devriez avoir créé le premier pour le passer en paramètre à la méthode __init__ du second, et inversement, ce qui n'est pas possible. On prend alors le parti de déjà réserver un champ qui s'appelle best_friend et worst_enemy, mais de l'initialiser à None dans la méthode __init__ — ce qui signifie l'absence de valeur. On leur donne ensuite une valeur si nécessaire en dehors de la méthode __init__ comme le montre le code de base.
Pour vérifier si un tel attribut est défini ou pas, vous pouvez faire, si p est du type de la classe en question:
if p.best_friend is not None: # p a un meilleur ami, dont le nom est p.best_friend.name
ou inversement:
if p.best_friend is None: # p n'a pas de meilleur ami défini
Meilleures salutations,
Jean-Philippe Pellet