Pergunta

Eu estou escrevendo uma extensão para a biblioteca e eu gostaria de registrar a minha nova função com um dicionário de ponteiros de função na classe base.O meu entendimento é de que o dicionário, pois é a primeira escopo dentro de uma classe, é estático e deve ser actualização capaz.No entanto, quando tento update() o dicionário com a nova função na classe, ele me diz que é indefinido.O seguinte exemplo mínimo reproduz o erro:

def somefunction1(v):
    return v

def somefunction2(v):
    return v

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

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

Executar ele dá o seguinte erro

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

NameError: name 'dictionary' is not defined

Desde que eu não posso (razoavelmente) modificar o original SomeClass existe alguma maneira de contornar isso?

Editar:O resultado desejado é que SomeExtensionClass terá dictionary={'a':somefunction1, 'b':somefunction2}

Foi útil?

Solução

Se você deseja modificar SomeClass.dictionary, apenas se referem a ele como SomeClass.dictionary:

SomeClass.dictionary.update(whatever)

Variável de pesquisa dentro de um class declaração de não olhar através do super-classes, atributos.

Se você deseja um novo dicionário, para que SomeExtensionClass.dictionary é diferente de SomeClass.dictionary, você vai querer copiar o original e atualizar a cópia:

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

Outras dicas

Há dois razoável maneiras de dar SomeExtensionClass uma atualizada no dicionário:

  1. Atualização do dicionário original referindo-se a SomeClass.dictionary.
  2. Definir um segundo dictionary variável para a classe derivada.

Você pode fazer o segundo, semelhante a este:

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

O que você deve escolher depende de quem usa o dicionário e para que.Se um SomeClass método utiliza a variável como este:

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

O método irá utilizar o SomeExtensionClass dicionário para SomeExtensionClass objetos.Se OTOH ele faz:

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

Ele vai sempre usar o dicionário definido no SomeClass.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top