问题描述
我正在尝试实现一个懒惰的属性。
比如说,一个对象是由object._x = None初始化的,然后我想写一些东西
@property
def x(self):
return self._x or (init_x_value(); x)
这样只有在第一次查找属性时才会调用初始值设定项。
在scala中,表达式可以包含语句。
python中有类似的东西可能。
如果没有,有没有其他方法来实现它,或者我应该坚持使用if-else ?
1楼
如果init_x_value 返回None ,您只需使用:
return self._x or init_x_value() or self._x
但请注意,就像在评论中所说的那样,如果self._x是假的,比如None , [] (空列表), ()一个空元组,或者一个覆盖__bool__方法的类,它将会转到init方法,这可能是计算上昂贵的。
如果init_x_value 返回计算出的x值本身,您甚至可以像下面这样写:
return self._x or init_x_value()
这是因为Python中的or非常特殊: x or y工作原理如下:
if bool(x):
return x
else:
return y
并且懒惰地生成x和y 。
由于bool(None)在第一种情况下为False ,因此它将检查self._x 。
如果self._x是None ,它会通过调用进行init_x_value()因为该方法不返回任何它隐含返回None其不被接受or α链要么,所以它终于解决了最后self._x这就是现在组。
2楼
要回答标题问题本身:不,在Python中,表达式不能包含语句。 期。
编写getter的正确pythonic方法是:
@property
def x(self):
# assume _x defaults to None
if self._x is None:
# here you can have has many statements as
# you like ;)
self._x = init_x_value()
return self._x
可能看起来不像三重'或'或内联语句那样聪明,但它尽可能简单,直接,清晰和可读 。
3楼
您可以隐藏函数中的语句:
@property
def x(self):
def initialize_and_return_x():
init_x_value()
return self._x
return self._x or initialize_and_return_x()