我假设您的主要目标是让pages 在设置了特定标志时返回不同的值。根据您的目标,一种可能有效的方法是使pages 成为属性(在精确的Python 意义上)而不是属性。然后让它返回一个带有toc 或不带的值,这取决于是否设置了标志。比如:
class Book(object):
def __init__(self, toc, pages):
self._toc = toc
self._pages = pages
self.include_toc = False
@property
def pages(self):
if self.include_toc:
return self._pages + self._toc
else:
return self._pages
它的工作原理如下:
>>> b = Book(5, 55)
>>> b.pages
55
>>> b.include_toc = True
>>> b.pages
60
这并没有完全满足您的要求,但对于某些用例子集(即您将多次调用 @ 987654326@ 设置了标志,只是偶尔更改标志——例如当include_toc 由最终用户设置时,或者当一本书几乎总是或几乎不应该在其页数中包含_toc 时。)
但是,正如 phant0m 指出的那样,该标志是持久的,因此在某些情况下,如果您设置它然后在完成后未能重置它,这可能会产生意想不到的结果。正如 eryksun 所指出的,上下文管理器是该问题的经典解决方案。
虽然这可能确实是过度设计,但它非常简单,我还是会演示一下。只需将其添加到Book 的定义中:
@contextlib.contextmanager
def set_toc_reset(self, state):
try:
old_flag = self.include_toc
self.include_toc = state
yield self
finally:
self.include_toc = old_flag
这会为您重置标志:
>>> from foo import Book
>>> b = Book(5, 55)
>>> with b.set_toc_reset(True):
... print b.pages
...
60
>>> b.include_toc
False