hériter d'un attribut de classe à partir d'une classe Super puis modifiant la valeur de la sous-classe fonctionne bien:
class Unit(object): listvalue = [10] class Archer(Unit): pass print Unit.listvalue print Archer.listvalue Archer.listvalue[0] = 5 print Unit.listvalue print Archer.listvalue
3 Réponses :
Ce n'est pas une question de copies peu profondes ou profondes, c'est une question de références et d'affectations. P>
C'est le premier cas Pour résoudre votre problème, vous devez attribuer une nouvelle valeur de liste au Si ces valeurs ne seront accessibles qu'aux méthodes de classe, la solution la plus simple est de faire la mission lorsque la classe est initialisée. P> unité.Value code> et
archer.value code> sont deux variables qui font référence à la même valeur. Lorsque vous faites
archer.value = 5 code>, vous attribuez une nouvelle référence à ACHER.VALUE. P>
archer.list code>. p>
Merci pour la réponse. Mon problème était que je voulais que les avantages des deux: je souhaitais ajouter de nouveaux attributs à l'unité que Archer devrait également obtenir, mais lors de la modification de la valeur de l'attribut nouvellement hérité de Archer, l'attribut de l'unité (ou d'autres décendants d'unité) devait reste le même. D'autre part, si j'ai décidé de supprimer à nouveau l'attribut de l'unité, Archer devrait également la perdre. Ce qu'il n'était bien sûr pas si une nouvelle variable a été créée. -_- ° erreur logique de la mine.
Vous pouvez copier la liste dans la définition d'Archer:
class Archer(Unit): listvalue = Unit.listvalue[:]
La réponse de Michael est belle et simple, mais si vous souhaitez éviter d'ajouter cette ligne à chaque sous-classe de l'unité - vous avez peut-être une bande d'autres listes comme celle-là, une métaclasse est un moyen facile de résoudre le problème
class UnitMeta(type): def __init__(self, *args): super(UnitMeta, self).__init__(*args) for superclass in self.__mro__: for k,v in vars(superclass).items(): if isinstance(v, (list, dict, )): setattr(self, k, type(v)(v)) class Unit(object): __metaclass__ = UnitMeta listvalue = [10] class Archer(Unit): pass