006_003 Python 禁止添加新的属性

代码如下:

#encoding=utf-8

print '中国'

#禁止添加新的属性
def no_new_attributes(wrapped_setattr):
    def __setattr__(self, name, value):
        if hasattr(self, name):    # not a new attribute, allow setting
            wrapped_setattr(self, name, value)
        else:                      # a new attribute, forbid adding it
            raise AttributeError("can't add attribute %r to %s" % (name, self))
    return __setattr__
#核心在于设置不能添加新的属性,即修改自带的__setattr__函数
class NoNewAttrs(object):
    __setattr__ = no_new_attributes(object.__setattr__)
    class __metaclass__(type):       
        __setattr__ = no_new_attributes(type.__setattr__)
        
class Person(NoNewAttrs):
    firstname = ''
    lastname = ''
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname
    def __repr__(self):
        return 'Person(%r, %r)' % (self.firstname, self.lastname)
    
me = Person("Michere", "Simionato")
print me

me.firstname = "Michele"
print me

#Exception 不能修改属性
try: Person.address = ''
except AttributeError, err: print 'raised %r as expected' % err
try: me.address = ''
except AttributeError, err: print 'raised %r as expected' % err

打印结果如下:

中国
Person('Michere', 'Simionato')
Person('Michele', 'Simionato')
raised AttributeError("can't add attribute 'address' to <class '__main__.Person'>",) as expected
raised AttributeError("can't add attribute 'address' to Person('Michele', 'Simionato')",) as expected

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书山登峰人

精品不易

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值