Cómo acceder a la cadena dada del atributo del objeto correspondiente al nombre de ese atributo

154

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

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

t = Test()
x = "attr1"
Poeta nulo
fuente

Respuestas:

285

Hay funciones integradas llamadas getattrysetattr

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

En este caso

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
Pratik Deoghare
fuente
12
También hay delattr para eliminar atributos, pero esto rara vez se usa.
Dave Kirby
11
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
¿hay alguna forma de 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 como esta, getattr(x, 'shape')o getattr('df1', 'shape'). Sé que esto no se puede hacer con getattr, ningún otro método.
ihightower
que puedes hacergetattr(globals()[x], 'shape')
afultar
3

Nota: esta respuesta está muy desactualizada. Se aplica a Python 2 usando el newmódulo que fue desaprobado en 2008 .

Hay python integrado en las funciones setattr y getattr. Que puede usarse 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
aatifh
fuente
0

Si desea mantener la lógica oculta dentro de la clase, puede preferir usar un método getter 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ía obteniendo un bucle interminable que no podía resolver cuando intentaba recuperar el valor del atributo dentro de ese método.

También tenga en cuenta que puede utilizar 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 varsy setattr? .

not2savvy
fuente