J'ai ce problème générique en python. La classe de base définit un attribut de classe class_attr
. Cet attribut est immuable, dans ce cas c'est un nombre. Je veux changer cet attribut d'une classe dérivée, reliant ainsi Base.class_attr
à la nouvelle valeur (dans mon cas de jouet, l'incrémentant).Rebobinage d'un attribut de classe immutable dans la classe de base à partir d'une classe dérivée
La question est comment faire ceci sans nommer explicitement Base
dans l'instruction Base.class_attr += 1
.
class Base(object):
# class attribute:
class_attr = 0
class Derived(Base):
@classmethod
def increment_class_attr(cls):
Base.class_attr += 1
# is there a solution which does not name the owner of the
# class_attr explicitly?
# This would cause the definition of Derived.class_attr,
# thus Base.class_attr and Derived.class_attr would be
# two independent attributes, no more in sync:
# cls.class_attr += 1
Derived.increment_class_attr()
Derived.increment_class_attr()
print Base.class_attr # 2
S'il vous plaît noter: Je suis après la question même, c'est-ce que je peux rebind les attributs d'une classe parente. Je ne suis pas après les solutions de contournement à ce problème (par exemple, déplacer increment_class_attr
à la base).
Merci, mais cela a à peu près le même niveau de maintenabilité que l'original avec 'Base'. Qu'en est-il si j'hérite Dérivé multiplier 'Derived (AnotherBase, Base)' ou à travers plusieurs héritage simple 'Derived1 (Base)'; 'Dérivé (Derived1)'? – ondrejdee
'__bases__' et' Base' n'ont rien en commun. '__bases__' fait référence aux classes héritées. Il retourne un tuple de classes: 'p, = cls .__ bases__' obtient le premier (La première classe héritée - dans ce cas,' Base'.) – TyrantWave
Oui j'ai compris votre code, ce que je dis c'est que quand j'en ai un autre baseclass nommée 'AnotherBase' et déclarez une classe dérivée' class Derived (AnotherBase, Base) 'alors votre variable' p' ne se rapportera plus à 'Base' mais' AnotherBase', mais 'AnotherBase' n'est pas le propriétaire de la classe De même, avec l'héritage chaîné, 'p' se référera à' Derived1', pas à 'Derived' – ondrejdee