La actualización de una variable estática a la hora de ampliar una clase de Python
-
21-12-2019 - |
Pregunta
Estoy escribiendo una extensión de la biblioteca y desearía registrar mi nueva función con un diccionario de punteros a función de la clase base.Mi entendimiento es que el diccionario, ya que es en la parte superior de alcance dentro de una clase, es estática y debe ser la actualización de-poder.Sin embargo, cuando intento update()
el diccionario con la nueva función de la clase extendida me dice que no está definido.El siguiente ejemplo mínimo reproduce el error:
def somefunction1(v):
return v
def somefunction2(v):
return v
class SomeClass(object):
dictionary = {'a':somefunction1}
class SomeExtensionClass(SomeClass):
dictionary.update({'b':somefunction2})
Ejecutando da el siguiente error
9
10 class SomeExtensionClass(SomeClass):
---> 11 dictionary.update({'b':somefunction2})
NameError: name 'dictionary' is not defined
Ya que no puedo (razonablemente) modificar el original SomeClass
¿hay alguna forma de evitar esto?
Editar:El resultado deseado es que SomeExtensionClass
se han dictionary={'a':somefunction1, 'b':somefunction2}
Solución
Si desea modificar SomeClass.dictionary
, sólo se refieren a ella como SomeClass.dictionary
:
SomeClass.dictionary.update(whatever)
Variable de búsqueda dentro de un class
declaración de no mirar a través de las superclases' atributos.
Si usted quiere un nuevo diccionario, así SomeExtensionClass.dictionary
es diferente de SomeClass.dictionary
, usted querrá copiar el original y la actualización de la copia:
class SomeExtensionClass(SomeClass):
dictionary = SomeClass.dictionary.copy()
dictionary.update(whatever)
Otros consejos
Hay dos formas razonables para dar SomeExtensionClass una actualización del diccionario:
- Actualización el diccionario original, refiriéndose a
SomeClass.dictionary
. - Definir un segundo
dictionary
variable para la clase derivada.
Usted puede hacer la segunda como este:
class SomeExtensionClass(SomeClass):
dictionary = dict(SomeClass.dictionary, b=somefunction2)
Que debe elegir depende de quién utiliza el diccionario y para qué.Si un SomeClass método utiliza la variable como esta:
def foo(self):
a = self.dictionary['a']()
El método que se utilizará el SomeExtensionClass diccionario para SomeExtensionClass objetos.Si OTOH lo que hace:
def foo(self):
a = SomeClass.dictionary['a']()
Siempre utilice el diccionario define en SomeClass.