python 类的属性只读方法_类中只读的Python属性

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中应该删除它们

如上所述,如果有人想改变这种行为,可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值