"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como adicionar propriedades dinâmicas a classes como entradas de dicionário?

Como adicionar propriedades dinâmicas a classes como entradas de dicionário?

Publicado em 2024-11-08
Navegar:329

How to Add Dynamic Properties to Classes like Dictionary Entries?

Adicionando propriedades dinâmicas às classes

Na busca para simular um conjunto de resultados de banco de dados usando classes simuladas, surge um desafio: como atribuir propriedades dinâmicas propriedades para uma instância que se assemelha às de um dicionário. Isso envolve a criação de propriedades que se comportam como atributos com valores específicos.

Inicialmente, uma abordagem promissora envolvia atribuir propriedades usando:

setattr(self, k, property(lambda x: vs[i], self.fn_readyonly))

No entanto, isso gerou objetos de propriedade em vez do comportamento desejado.

A solução está em adicionar propriedades à própria classe, em vez de instâncias individuais. Veja como funciona:

class Foo(object):
    pass

foo = Foo()
foo.a = 3
Foo.b = property(lambda self: self.a   1)
print(foo.b)  # Prints 4

Neste exemplo, adicionamos uma propriedade b à classe Foo usando o descritor de propriedade. Ao acessar foo.b, Python chama o método __get__ do descritor e passa a instância da classe como argumento. O método __get__ então retorna o valor da propriedade, que é calculado como self.a 1.

As propriedades fornecem uma maneira conveniente de definir o comportamento personalizado para atributos, expondo efetivamente o encanamento do sistema OO do Python.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3