Python Cookbook学习记录 ch6_3_2013/11/7
2013-11-07 22:51
513 查看
6.3限制属性的设置
通常情况下,Python允许随意给类和类实例增加属性。但是对于某些特性的类,希望这种自由受到限制
一种优雅的实现方法是写一个类和一个简单的自定义元类,再加上一个封装函数。
结果的输出:
关于类和元类方面的东西可以参考这个帖子: http://blog.jobbole.com/21351/
通常情况下,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/
相关文章推荐
- Python Cookbook学习记录 ch6_2_2013/11/7
- Python Cookbook学习记录 ch6_1_2013/11/6
- Python Cookbook学习记录 ch3_5/8_2013/10/30
- Python Cookbook学习记录 ch3_1/2_2013/10/29
- Python Cookbook学习记录 ch1_1_2013/10/20
- Python Cookbook学习记录 ch1_3_2013/10/21
- Python Cookbook学习记录 ch1_9_2013/10/23
- Python Cookbook学习记录 ch2_1_2013/10/27
- Python Cookbook学习记录 ch2_6/7/8_2013/10/27
- Python Cookbook学习记录 ch1_5_2013/10/22
- Python Cookbook学习记录 ch1_6_2013/10/22
- Python Cookbook学习记录 ch4_8-16_2013/11/2
- Python Cookbook学习记录 ch1_14_2013/10/25
- Python Cookbook学习记录 ch4_1-5_2013/11/2
- Python Cookbook学习记录 ch1_8_2013/10/23
- Python Cookbook学习记录 ch2_9/16_2013/10/28
- Python Cookbook学习记录 ch1_7_2013/10/22
- Python Cookbook学习记录 ch1_10_2013/10/23
- Python Cookbook学习记录 ch1_13_2013/10/24
- Python Cookbook学习记录 ch1_15_2013/10/25