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/
浙公网安备 33010602011771号