【发布时间】:2020-04-12 00:34:50
【问题描述】:
我想为我的类动态添加属性,如下所示,但是我最终创建了别名。我怎样才能防止这种情况发生?
class A:
def __init__(self, a, b):
self._a = a
self._b = b
for attr in ('a', 'b'):
f = lambda self: getattr(self, '_'+attr)
setattr(A, attr, property(f, None))
a = A(0,1)
print(a.a)
print(a.b)
然而这会产生:
1
1
编辑:
关于闭包作用域的评论是相关的,但是这留下了一个问题,即是否可以动态生成引用 self open 的某些属性的属性。
特别是关于上面的例子:如果有的话,我如何设置属性以使 a.a 返回 0 而不是 1?如果我只是尝试将属性参数传递给 lambda 函数,则需要传递该属性,因此这是行不通的。
【问题讨论】:
-
这能回答你的问题吗? Python lambda closure scoping
-
那么,这是否意味着无法动态设置引用自身某些属性的类的属性?
-
这意味着
attr在创建 lambda 时没有被评估,而是名称attr绑定到外部范围内的变量,最终具有值'b',所以两个 lambda 表达式都获得了_b属性。 -
我想我明白这一点。那么剩下的问题是:可以生成动态引用 self 的某些属性的属性吗?或者特别是关于上面的例子:如何设置属性使得 a.a 返回 0 而不是 1
标签: python dynamic properties alias