你可以使用 lambda 函数来做这种事情。
In [1]: b = 2
In [2]: c = 3
In [3]: a = lambda: b * c
In [4]: a
Out[4]: <function __main__.<lambda>>
In [5]: a()
Out[5]: 6
In [6]: b = 10
In [7]: a()
Out[7]: 30
而且,对于列表:
In [8]: l = lambda: [a(), b, c]
In [9]: l()
Out[9]: [30, 10, 3]
In [10]: b = 1
In [11]: l()
Out[11]: [3, 1, 3]
如果您不想将 a 和 l 作为函数调用,可以将它们封装在这样的类中:
class A(object):
@property
def a(self):
if callable(self._a):
return self._a()
else:
return self._a
@a.setter
def a(self, value):
self._a = value
@property
def b(self):
if callable(self._b):
return self._b()
else:
return self._b
@b.setter
def b(self, value):
self._b = value
然后,你在操作时不必知道 a 和 b 是 lambdas 还是“普通对象”,你可以像这样访问它们:
In [13]: x = A()
In [14]: x.a = lambda: x.b * 2
In [15]: x.b = 3
In [16]: x.a
Out[16]: 6
In [17]: x.b = 4
In [18]: x.a
Out[18]: 8