python - español - setattr jquery
Usando setattr() en python (4)
Estoy buscando a alguien que explique los conceptos básicos de cómo usarlo, y no usar setattr()
.
Mi problema surgió al tratar de usar un método / función de clase para devolver datos que luego se ponen en otro método / función. Quizás un enfoque más simple sería mucho mejor en este caso, pero estoy tratando de entender cómo funcionan / se usan las clases. Este problema parece depender de setattr()
, y este es mi intento de hacer un uso bastante simple de esto.
Aunque no es exactamente el mismo problema, estaba siguiendo a Python The Hard Way, ej . 42, el bucle while @ líneas 18-41.
Intenté escribir un /__init__()
, y usar getattr()
lugar, pensando que tal vez algo debía estar en el espacio de nombres de la clase, pero esto no parece ayudar.
#! /bin/python2.6
class HolyGrail(object):
def __init__(self):
self.start = ''start_at_init''
# function definition in question:
# TypeError: ''str'' object is not callable
def run_it(self):
start = setattr(self, ''name'', ''get_thing'')
start = self.name
# Something wrong here?
value_returned = start() #I believe this == self.get_thing()
use_it(value_returned)
"""
# alternate function definitions
# NameError: global name ''start'' is not defined
def __init__(self):
self.start = ''get_thing''
def run_it(self):
go_do_it = getattr(self, start)
first_output = go_do_it()
use_it(first_output)
"""
def get_thing(self):
return "The Knights Who Say ... Ni!"
def use_it(self, x):
print x
print "We want a shrubbery!"
my_instance = HolyGrail()
my_instance.run_it()
@Karl Knechtel, @Amber, @Chris Morgan gracias por su ayuda.
¡Creo que ahora puedo explicar mi propia respuesta! Esto requería una mejor comprensión de sí mismo como un objeto para mí. Es un nombre de instancia que se etiqueta con cosas como atributos.
La clase podría ser un pueblo, y luego. getattr
busca una casa usando su nombre para que esté listo para llamarlo pronto, y se le ocurre un lugar diferente si no encuentra la casa: con getattr getattr
un ''nombre'' y usted la encuentra. Hace que el paso de una función a otra sea dinámico Como beneficio adicional, puede tener un valor predeterminado, útil para obtener un método predeterminado de respaldo: ¿la conexión falló o algo así?
setattr
construye una casa y le da un nombre para que puedas llamarla más tarde. Usted podría potencialmente reconstruir esta casa, o ir a un lugar en particular si no puede encontrarla. - setattr
un nombre de atributo y le da, o cambia su valor, para que se lo llame más tarde. Tal vez un usuario apaga el sonido, entonces los métodos futuros no emiten ningún audio.
Podría haber escrito mi función de varias maneras, pero no es necesario cambiar ningún atributo:
def run_it(self):
yo = getattr(self, ''get_thing'')
answer = yo()
setattr(self, ''deal_accepted'', self.use_it) #really ott
no = getattr(self, ''deal_accepted'')
no(answer)
Código correctamente corregido:
def run_it(self):
value_returned = self.get_thing()
self.use_it(value_returned)
Está configurando self.name
a la cadena "get_thing"
, no a la función get_thing
.
Si desea que self.name
sea una función, entonces debe establecerlo en uno:
setattr(self, ''name'', self.get_thing)
Sin embargo, eso es completamente innecesario para tu otro código, porque simplemente puedes llamarlo directamente:
value_returned = self.get_thing()
Los documentos de Python dicen todo lo que se necesita decir, por lo que puedo ver.
setattr
( objeto , nombre , valor )Esta es la contraparte de
getattr()
. Los argumentos son un objeto, una cadena y un valor arbitrario. La cadena puede nombrar un atributo existente o un nuevo atributo. La función asigna el valor al atributo, siempre que el objeto lo permita. Por ejemplo,setattr(x, ''foobar'', 123)
es equivalente ax.foobar = 123
.
Si esto no es suficiente, explica lo que no entiendes.
Supongamos que desea asignar atributos a una instancia que anteriormente no estaba escrita en el código. El setattr()
hace justamente eso. Se necesita la instancia de la clase self
y la clave y el valor para establecer.
class Example:
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
Setattr: usamos setattr para agregar un atributo a nuestra instancia de clase. Pasamos la instancia de la clase, el nombre del atributo y el valor. Y con Getattr recuperamos estos valores.
Por ejemplo
Employee = type("Employee", (object,), dict())
employee = Employee()
# Set salary to 1000
setattr(employee,"salary", 1000 )
# Get the Salary
value = getattr(employee, "salary")
print(value)