【发布时间】:2011-06-11 23:52:33
【问题描述】:
我创建了一个类,其对象被初始化为 一堆 XML 代码。该类能够从 XML 中提取各种参数并将它们缓存在对象状态变量中。这些参数的潜在数量很大,用户很可能不需要其中的大部分。这就是我决定执行“惰性”初始化的原因。
在下面的测试用例中,这样的参数是title。当用户第一次尝试访问它时,getter 函数会解析 XML,正确初始化状态变量并返回其值:
class MyClass(object):
def __init__(self, xml=None):
self.xml = xml
self.title = None
def get_title(self):
if self.__title is None:
self.__title = self.__title_from_xml()
return self.__title
def set_title(self, value):
self.__title = value
title = property(get_title, set_title, None, "Citation title")
def __title_from_xml(self):
#parse the XML and return the title
return title
这看起来不错,对我来说很好用。但是,getter 函数实际上是一个“setter”函数,因为它对对象有非常显着的副作用,这让我有点不安。这是一个合理的担忧吗?如果是这样,我应该如何解决?
【问题讨论】:
-
无论问题的实际答案是什么,您都不应该使用前导双下划线。他们开始名称修改,即很多潜在的痛苦和零收益。只需使用一个前导下划线。
-
我不明白为什么这是个问题。
-
小重构建议:不要在构造函数中初始化
self._title,将getter中的条件替换为not hasattr(self, "_title")。 -
@delnan:这是 Eclipse 的 PyDev 默认创建属性的方式。
-
@Sven Marnach:
not hasattr(self, '_title')对于延迟初始化来说并不常见,并且也会比正常的属性查找和针对None的测试慢。
标签: python design-patterns for-loop getter-setter side-effects