问题描述
我正在尝试实现一个懒惰的属性。
比如说,一个对象是由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()