Cómo obtener el nombre de un atributo como cadena en Python.
Quiero recuperar el nombre del atributo para crear algo como un “puntero” en Python, por ahora uso la siguiente declaración pero no estoy satisfecho:
class foo:
name: str
last_name: str
class other:
def __init__(self, obj, var):
obj.__dict__[var] = "John"
f = foo("Jon", "Jon")
o = other(f, "name")
Quiero escribir:
o = other(f, f.name)
o mejor aún
o = other(f.name)
Intenté algunas funciones para obtener el nombre pero solo funcionan con objetos y no con atributos de objetos:
def retrieve_name(var: object) -> str:
for objname, oid in globals().items():
if oid is var:
return objname
if hasattr(oid, "__dict__"):
for child in oid.__dict__:
# no funciona porque el id es el mismo si el valor es el mismo
if id(oid.__dict__[child]) == id(var):
return child
Este código solo funciona si uso retrieve_name(f) -> f
pero no si uso retrieve_name(f.last_name) -> name
si f.name == f.last_name
porque id(f.name) == id(f.last_name)
cuando los valores de las cadenas son iguales.
davy.ai
Para recuperar el nombre del atributo y usarlo para crear un puntero en Python, puedes modificar la clase
other
para que acepte tanto el objeto como el nombre del atributo como argumentos en el constructor. Luego, puedes usar la funcióngetattr()
para recuperar el valor del atributo del objeto utilizando el nombre del atributo. Aquí tienes un ejemplo de código:En este ejemplo, la clase
other
almacena el valor del atributo en una variable de instancia con el mismo nombre que el atributo. Luego puedes acceder al valor utilizando la notación de puntos (o.name
).Si quieres crear un comportamiento similar a un puntero en Python, puedes usar los decoradores
@property
y@setter
para definir los getters y setters del atributo. Aquí tienes un ejemplo de código actualizado:En este ejemplo actualizado, la clase
foo
define_name
y_last_name
como variables de instancia privadas y usa los decoradores@property
y@setter
para definirname
ylast_name
como getters y setters respectivamente. La claseother
almacena el objeto y el nombre del atributo como variables de instancia y definevalue
yvalue.setter
como getters y setters respectivamente, usandogetattr()
ysetattr()
para recuperar y establecer el valor del atributo. Luego puedes usar las instancias de la claseother
como punteros al valor del atributo de las instancias de la clasefoo
.