Cómo acceder (obtener o establecer) el atributo del objeto dado la cadena correspondiente al nombre de ese atributo

2 minutos de lectura

Avatar de usuario de Nullpoet
nulopoeta

¿Cómo establece/obtiene los valores de los atributos de t dada por x?

class Test:
   def __init__(self):
       self.attr1 = 1
       self.attr2 = 2

t = Test()
x = "attr1"

Avatar de usuario de Pratik Deoghare
Deoghare Pratik

Hay funciones integradas llamadas getattr y setattr

getattr(object, attrname)
setattr(object, attrname, value)

En este caso

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)

  • También hay delattr para eliminar atributos, pero rara vez se usa.

    –David Kirby

    10 de abril de 2010 a las 7:33

  • y hasattr para probar si un objeto tiene o no un atributo específico, aunque en ese caso usar la forma de tres argumentos getattr (objeto, nombre de atributo, predeterminado) suele ser mejor.

    – Duncan

    10 de abril de 2010 a las 11:20

  • ¿Hay alguna forma de que podamos usar getattr como este y decir que tengo un marco de datos? df1y una variable x = 'df1' es decir, df1 como una cadena en var x. quiero imprimir la forma de df así, getattr(x, 'shape') o getattr('df1', 'shape'). Sé que esto no se puede hacer con getattr, ningún otro método.

    – ihightower

    1 de febrero de 2020 a las 13:50

  • tu puedes hacer getattr(globals()[x], 'shape')

    – afulto

    27 de julio de 2020 a las 23:46

  • @ihightower Ver ¿Cómo obtener el valor de una variable dado su nombre en una cadena? En resumen, no hay una forma general de hacerlo si se desconoce el alcance. La solución de afult asume que es global, aunque probablemente lo sea.

    – wjandrea

    11 de noviembre de 2021 a las 20:07

Si desea mantener la lógica oculta dentro de la clase, es posible que prefiera utilizar un método captador generalizado como este:

class Test:
    def __init__(self):
        self.attr1 = 1
        self.attr2 = 2

    def get(self,varname):
        return getattr(self,varname)

t = Test()
x = "attr1"
print ("Attribute value of {0} is {1}".format(x, t.get(x)))

Salidas:

Attribute value of attr1 is 1

Otro enfoque que podría ocultarlo aún mejor sería usar el método mágico. __getattribute__pero seguí recibiendo un bucle sin fin que no pude resolver al intentar recuperar el valor del atributo dentro de ese método.

También tenga en cuenta que puede usar alternativamente vars(). En el ejemplo anterior, podría intercambiar getattr(self,varname) por return vars(self)[varname]pero getattrpodría ser preferible según la respuesta a ¿Cuál es la diferencia entre vars y setattr?.

avatar de usuario de aatifh
aatifh

Nota: Esta respuesta está muy desactualizada. Se aplica a Python 2 usando el new módulo que fue obsoleto en 2008.

Hay funciones incorporadas de python setattr y getattr. Que se puede usar para establecer y obtener el atributo de una clase.

Un breve ejemplo:

>>> from new import  classobj

>>> obj = classobj('Test', (object,), {'attr1': int, 'attr2': int}) # Just created a class

>>> setattr(obj, 'attr1', 10)

>>> setattr(obj, 'attr2', 20)

>>> getattr(obj, 'attr1')
10

>>> getattr(obj, 'attr2')
20

¿Ha sido útil esta solución?