Python Cookbook学习记录 ch6_3_2013/11/7

6.3限制属性的设置

通常情况下,Python允许随意给类和类实例增加属性。但是对于某些特性的类,希望这种自由受到限制

一种优雅的实现方法是写一个类和一个简单的自定义元类,再加上一个封装函数。

# -*- coding: cp936 -*-
def no_new_attributes(wrapped_setattr):
    """试图添加新属性,报错
        但是允许已经存在的属性被随意设置"""
    def __setattr__(self,name,value):
        if hasattr(self,name):
            wrapped_setattr(self,name,value)
        else:
            raise AttributeError("can't add attribute %r to %s" %(name,self))
    return __setattr__

class NoNewAttrs(object):
    """NoNewAttrs的子类会拒绝新属性的添加
        但允许已存在的属性被赋予新值
    """
    #向此类的实例添加新属性的操作被屏蔽
    __setattr__ = no_new_attributes(object.__setattr__)
    class __metaclass__ (type):
        #metaclass是一个元类
        __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
# emits: Person('Michere', 'Simionato')
# oops, wrong value for firstname, can we fix it?  Sure, no problem!
me.firstname = "Michele"
print me
# emits: Person('Michele', 'Simionato')

关于类和元类方面的东西可以参考这个帖子: http://blog.jobbole.com/21351/

posted on 2013-11-07 22:51  七海之风  阅读(160)  评论(0)    收藏  举报

导航