¿Cómo establece / obtiene los valores de los atributos de t
dado por x
?
class Test:
def __init__(self):
self.attr1 = 1
self.attr2 = 2
t = Test()
x = "attr1"
¿Cómo establece / obtiene los valores de los atributos de t
dado por x
?
class Test:
def __init__(self):
self.attr1 = 1
self.attr2 = 2
t = Test()
x = "attr1"
Respuestas:
Hay funciones integradas llamadas getattr
ysetattr
getattr(object, attrname)
setattr(object, attrname, value)
En este caso
x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
df1
y 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.
getattr(globals()[x], 'shape')
new
mó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
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 getattr
podría ser preferible según la respuesta a ¿Cuál es la diferencia entre vars
y setattr
? .