Question

J'écris une extension pour une bibliothèque et j'aimerais enregistrer ma nouvelle fonction auprès d'un dictionnaire de pointeurs de fonction dans la classe de base.Je crois comprendre que le dictionnaire, puisqu'il se trouve dans la portée la plus élevée d'une classe, est statique et doit pouvoir être mis à jour.Cependant, lorsque j'essaie de update() le dictionnaire avec la nouvelle fonction dans la classe étendue, il me dit qu'elle n'est pas définie.L'exemple minimal suivant reproduit l'erreur :

def somefunction1(v):
    return v

def somefunction2(v):
    return v

class SomeClass(object):
    dictionary = {'a':somefunction1}

class SomeExtensionClass(SomeClass):
    dictionary.update({'b':somefunction2})

L'exécuter donne l'erreur suivante

 9 
 10 class SomeExtensionClass(SomeClass):
 ---> 11         dictionary.update({'b':somefunction2})

NameError: name 'dictionary' is not defined

Puisque je ne peux pas (raisonnablement) modifier l'original SomeClass y a-t-il un moyen de contourner ce problème ?

Modifier:Le résultat souhaité est que SomeExtensionClass aura dictionary={'a':somefunction1, 'b':somefunction2}

Était-ce utile?

La solution

Si vous souhaitez modifier SomeClass.dictionary, il suffit de l'appeler SomeClass.dictionary:

SomeClass.dictionary.update(whatever)

Recherche de variable dans un class L'instruction ne examine pas les attributs des superclasses.

Si vous voulez un nouveau dictionnaire, alors SomeExtensionClass.dictionary est différent de SomeClass.dictionary, vous souhaiterez copier l'original et mettre à jour la copie :

class SomeExtensionClass(SomeClass):
    dictionary = SomeClass.dictionary.copy()
    dictionary.update(whatever)

Autres conseils

Il existe deux manières raisonnables de donner à SomeExtensionClass un dictionnaire mis à jour :

  1. Mettez à jour le dictionnaire original en vous référant à SomeClass.dictionary.
  2. Définir une seconde dictionary variable pour la classe dérivée.

Vous pouvez faire la seconde comme ceci :

class SomeExtensionClass(SomeClass):
    dictionary = dict(SomeClass.dictionary, b=somefunction2)

Le choix dépend de qui utilise le dictionnaire et pour quoi.Si une méthode SomeClass utilise la variable comme ceci :

def foo(self):
    a = self.dictionary['a']()

La méthode utilisera le dictionnaire SomeExtensionClass pour les objets SomeExtensionClass.Si OTOH, c'est le cas :

def foo(self):
    a = SomeClass.dictionary['a']()

Il utilisera toujours le dictionnaire défini dans SomeClass.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top