C++EEE>相同的结构”。现在,越来越多的语言倾向于提供一种改变实例结构的方法。
总之,有一个所谓的描述符协议,它是Python最强大的(也是最容易被误解的)特性之一。
使用描述符(作为附加注释,属性依赖于它们),我编写了一段代码,在某种程度上实现了您的要求:class LockedAttribute(object):
def __init__(self, name):
self._name = name
self._set_count = 0
self._set_treshold = 1
def __get__(self, instance, cls):
return instance.__dict__[self._name]
def __set__(self, instance, value):
if self._set_count >= self._set_treshold:
raise AttributeError("Can't set attribute '{}'".format(self._name))
else:
instance.__dict__[self._name] = value
self._set_count += 1
def __delete__(self, instance):
raise AttributeError("Can't delete attribute '{}'".format(self._name))
class GenericStrategy(object):
portfolio = LockedAttribute("portfolio")
def __init__(self, portfolio):
self.portfolio = portfolio
try:
self.portfolio = portfolio
except AttributeError as e:
print(" ERROR: {}".format(e))
def set_portfolio(self, new_value):
self.portfolio = new_value
if __name__ == "__main__":
strategy = GenericStrategy("some portfolio name")
print("Portfolio: {}".format(strategy.portfolio))
try:
del strategy.portfolio
except AttributeError as e:
print(" ERROR: {}".format(e))
try:
strategy.set_portfolio("some 2nd portfolio name")
except AttributeError as e:
print(" ERROR: {}".format(e))
try:
strategy.portfolio = "some 3rd portfolio name"
except AttributeError as e:
print(" ERROR: {}".format(e))
print("Portfolio: {}".format(strategy.portfolio))
注意:我从private属性的名称(portfolio)中删除了__,以避免在代码中使用我所说的损坏(这将使阅读更加困难)
对于Py27兼容性,类继承object。如果兼容性不是必需的,则可以删除继承关系(默认情况下在Py3x中)
我添加了try/except块来说明行为,在production中应该删除它们
如上所述,如果有人想改变这种行为,可以