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"

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)

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

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? .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.