Acceder à un attribut de classe par un variable
Fermémamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 - 15 mars 2023 à 18:30
- Dans le code de la page, modifiez la couleur de fond de la classe .pix. un code de 4 chiffres doit apparaître dans la grille. lequel ?
- Code ascii de a - Guide
- Code de déverrouillage oublié - Guide
- Code gta 4 ps4 - Guide
- Code puk bloqué - Guide
- Supprimer une page dans word - Guide
4 réponses
14 mars 2023 à 08:56
Bonjour,
Dans Var = 'pointx', Var est une variable, un contenant, et 'pointx' est une chaine de caractères contenue
dans Var
En écrivant p.Var = 9, tu ne modifie pas l'attribut pointx de la classe, tu ajoutes juste un attribut
nommé Var et tu lui donnes la valeur 9
De plus quel est l'intérêt de ce truc ?
Tu devrais utiliser le constructeur __init__() et accéder aux attributs de cette façon:
class Point: def __init__(self,x = 0.0,y = 0.0,z=0.0): self.x = x self.y = y self.z = z p1 = Point(10.3, 5.2, 7.8) print(p1.x)
14 mars 2023 à 11:41
bonjour,
C'est possible, et je ne pense pas que ce soit une bonne idée. Pourquoi veux-tu faire cela?
class Point: pointx = 3 pointy = 7 pointZOZO = "khkhkhkh" p = Point() Var = "pointx" #un truc du genre # p.Var = 9 setattr(p, Var, 9) print("p : x =", p.pointx, "y =", p.pointy)
Modifié le 15 mars 2023 à 18:33
Bonjour,
Il y a vraisemblablement confusion entre attribut de classe (attaché au type et partagé par toutes ses instances) et attribut d'instance (attaché à une instance de ce type). Ici, les coordonnées d'un point sont propres à une instance de point, et donc elles ne doivent pas être en attribut de classe mais bien en attribut d'instance.
class Point: xmin = 0 xmax = 1000 ymin = 0 ymax = 1000 def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return f"Point<{self.x}, {self.y}>" p1 = Point(1, 11) print(p1) # Point<1, 11>
Dans l'exemple ci-dessus :
- xmin, xmax, ymin, ymax sont communes à tous les Points ;
- on y accède normalement via le nom de la classe
print(Point.xmin, Point.xmax, Point.ymin, Point.ymax) # OK
- ... et on peut y accéder via une instance de cette classe (même si l'instance en elle-même n'a aucune utilité, seul son type importe)
p1 = Point(1, 11) print(p1.xmin, p1.xmax, p1.ymin, p1.ymax) # OK, mais bof
- on y accède normalement via le nom de la classe
- x et y sont spécifique à chaque instance de Point. On ne peut que y accéder au travers d'une instance (pas au travers dy type)
print(p1.x, p1.y) # OK print(Point.x, Point.y) # Faux: x et y ne sont pas des attributs de classe
Ensuite tu peux parfaitement combiner des instructions mettant en jeu des attributs de classe et d'instance :
class Point: xmin = 0 xmax = 1000 ymin = 0 ymax = 1000 def __init__(self, x, y): if not (Point.xmin <= x < Point.xmax): raise ValueError(f"Invalid x: {Point.xmin} <= {x} < {Point.xmax}") if not (Point.ymin <= y < Point.ymax): raise ValueError(f"Invalid y: {Point.ymin} <= {y} < {Point.ymax}") self.x = x self.y = y def __repr__(self): return f"Point<{self.x}, {self.y}>" p1 = Point(1, 11) # OK p2 = Point(-2, 22) # ValueError: Invalid x: 0 <= -2 < 1000
Bonne chance