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}

¿Fue útil?

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:

  1. Actualización el diccionario original, refiriéndose a SomeClass.dictionary.
  2. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top