quiero form.data['field']
y form.field.value
tener siempre el mismo valor
Esto es factible, porque se trata de nombres representativos e indexación - es decir,, completamente construcciones diferentes de nombres desnudosa
y b
que está preguntando acerca de, y para con su solicitud es completamente imposible. ¿Por qué pedir algo imposible y totalmente diferente de lo (posible) que realmente quiere?!
Tal vez no se da cuenta de cuán drásticamente diferentes nombres desnudos y nombres decorados son. Cuando te refieres a un nombre simple a
, obtienes exactamente el objeto por el que a
estuvo vinculado por última vez en este ámbito (o una excepción si no estaba vinculado en este ámbito): este es un aspecto tan profundo y fundamental de Python que no puede ser subvertido. Cuando se refiere a un decorado nombre x.y
, está pidiendo un objeto (se refiere al objeto x
) para proporcionar "el atributo y
" - y en respuesta a esa solicitud, el objeto puede realizar cálculos totalmente arbitrarios (y la indexación es bastante similar: también permite realizar cálculos arbitrarios en respuesta).
Ahora, su ejemplo de "real desapego" es misterioso porque en cada caso se involucran dos niveles de indexación o de obtención de atributos, por lo que la sutileza que anhela podría introducirse de muchas maneras. ¿Qué otros atributos se supone que tiene form.field
tener, por ejemplo, además de value
? Sin que una mayor .value
cálculos, posibilidades incluirían:
class Form(object):
...
def __getattr__(self, name):
return self.data[name]
y
class Form(object):
...
@property
def data(self):
return self.__dict__
La presencia de .value
sugiere recoger la primera forma, además de una envoltura inútil de tipo de:
class KouWrap(object):
def __init__(self, value):
self.value = value
class Form(object):
...
def __getattr__(self, name):
return KouWrap(self.data[name])
Si asignaciones tales form.field.value = 23
también se supone que establece t que la entrada en form.data
, a continuación, la envoltura debe ser más compleja de hecho, y no tan inútil:
class MciWrap(object):
def __init__(self, data, k):
self._data = data
self._k = k
@property
def value(self):
return self._data[self._k]
@value.setter
def value(self, v)
self._data[self._k] = v
class Form(object):
...
def __getattr__(self, name):
return MciWrap(self.data, name)
El último ejemplo es aproximadamente tan cerca como se pone, en Python, con el sentido de "un puntero", como parece querer, pero es crucial entender que tales sutilezas solo pueden funcionar con indexando y/o nombres decorados, nunca con nombres desnudos como originalmente lo solicitó!
Tal vez pueda hacer una pregunta similar a S. Lott de (pero más productivo): nos muestras algún código real en el que quieres hacer esto? ¿Quizás incluso en otro idioma que sea más de tu gusto? Es probable que el problema que está tratando de resolver se preste a una solución más Pythonic, y centrarse en "Quiero indicadores" está oscureciendo la respuesta real. –
No requiere mucha imaginación; Puedo pensar en docenas de razones para querer hacer esto. Simplemente no es cómo se hace en lenguajes sin puntero como Python; necesitas envolverlo en un contenedor que no sea invariable, como en la respuesta de Matt. –
@Ned: Q actualizada. Otro ejemplo sería para una función, 'swap (a, b)'. No es que lo necesite en este momento. – mpen