"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo agregar propiedades dinámicas a clases como entradas de diccionario?

¿Cómo agregar propiedades dinámicas a clases como entradas de diccionario?

Publicado el 2024-11-08
Navegar:648

How to Add Dynamic Properties to Classes like Dictionary Entries?

Agregar propiedades dinámicas a las clases

En la búsqueda de simular un conjunto de resultados de una base de datos usando clases simuladas, surge un desafío: cómo asignar propiedades a una instancia que se parecen a las de un diccionario. Esto implica crear propiedades que se comportan como atributos con valores específicos.

Inicialmente, un enfoque prometedor implicaba asignar propiedades usando:

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

Sin embargo, esto produjo objetos de propiedad en lugar del comportamiento deseado.

La solución radica en agregar propiedades a la clase misma, en lugar de instancias individuales. Así es como funciona:

class Foo(object):
    pass

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

En este ejemplo, agregamos una propiedad b a la clase Foo usando el descriptor de propiedad. Al acceder a foo.b, Python llama al método __get__ del descriptor y pasa la instancia de clase como argumento. Luego, el método __get__ devuelve el valor de la propiedad, que se calcula como self.a 1.

Las propiedades proporcionan una manera conveniente de definir un comportamiento personalizado para los atributos, exponiendo efectivamente las tuberías del sistema OO de Python.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3