我希望
form.data['field']并form.field.value始终拥有相同的价值
这是可行的,因为它涉及修饰的名称和索引-即与 裸* 名 完全
不同的结构以及您所要询问的内容,对于您的请求来说是完全不可能的。为什么要索取不可能的东西 , 而这 又与 您实际 想要
的(可能的)东西完全不同? a``b
*** __
也许您不知道裸名和修饰名有多么大的不同。当您引用裸名时
a,您将确切地知道该对象
a在该范围中最后绑定到该对象(如果未在该范围内绑定则为例外),这是Python如此深入和基础的方面,它可以不可能被颠覆。当您引用
修饰的
名称时
x.y,您正在要求一个对象(该对象所
x引用的)请提供“
y属性”-并响应该请求,该对象可以执行完全任意的计算(并且索引非常相似:它还允许作为响应执行任意计算)。
现在,您的“实际需求”示例很神秘,因为在每种情况下都涉及两个级别的索引编制或属性获取,因此可以通过多种方式引入您渴望的精妙之处。
form.field例如,假设还具有其他哪些属性
value?如果没有进一步的
.value计算,可能性将包括:
class Form(object): ... def __getattr__(self, name): return self.data[name]
和
class Form(object): ... @property def data(self): return self.__dict__
的存在
.value表明采摘第一种形式,加上一种-的无用的包装:
class KouWrap(object): def __init__(self, value): self.value = valueclass Form(object): ... def __getattr__(self, name): return KouWrap(self.data[name])
如果还应将这样的 赋值
form.field.value =23设置为中的条目
form.data,则包装器的确必须变得更加复杂,而并非所有这些都没有用:
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] = vclass Form(object): ... def __getattr__(self, name): return MciWrap(self.data, name)
在Python中,后一个示例大致与您想要的“指针”意义相近-但至关重要的是要了解,这样的微妙只能与 索引 和/或 修饰的名称一起使用 ,
决不能 像您最初要求的那样使用裸名!



