Atualizar uma variável estática durante a extensão de uma classe Python
-
21-12-2019 - |
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}
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:
- Atualização do dicionário original referindo-se a
SomeClass.dictionary
. - 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.