您的位置:首页 > 编程语言 > Python开发

Python Cookbook学习记录 ch6_3_2013/11/7

2013-11-07 22:51 513 查看
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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: