我正在尝试编写一个简短的类来表示存储在远程服务器上的对象。我希望在本地设置对象的属性而不在远程服务器上设置它们通常是一个坏主意;这意味着本地对象不再代表远程对象,甚至没有意识到这一事实。
我曾计划使用如下代码来处理这个问题。如果你想设置它,它会让你在脚下开枪item.name
,但假设用户会明智而不这样做。
class Item(object):
def __init__(self):
self.name = get_item_name()
def set_name(self, name):
try:
set_item_name(name)
except:
handle_error()
raise
else:
self.name = name
但是,我最近遇到了@property
装饰器,它让我写了以下内容:
class Item(object):
def __init__(self):
self._name = get_item_name()
@property
def name(self):
return self._name
@name.setter
def name(self, value):
try:
set_item_name(value)
except:
handle_error()
raise
else:
self._name = value
这样做的好处是仍然允许使用 访问属性item.name
,但也可以处理item.name = blah
赋值。
然而,虽然第二个代码块提供(在我看来是)更好的行为,但它在属性设置中隐藏了一个函数调用,并且考虑到Zen的“显式优于隐式”以及 Python 类应该不向他们的用户隐藏东西,这是否会使第二个代码块不那么 Pythonic?