python---__getattr__\__setattr_重载'.'操作

#!coding:utf-8

class Person(object):
    def __init__(self,id):
        #定义一个名为ID的属性
        self.ID=id
    def __getattr__(self,attr):
        #__getattr__用于重载对象实例的'.'操作符,
        #如果.操作符调用的属性存在就直接返回属性;不然就调用__getattr__来返回
        print 'in __getattr__'
        if attr=='Name':
            return 'My name is hello world'
        else:
            raise AttributeError,attr
    def __setattr__(self,attr,value):
        if attr=='Name':
            #注意这个时间是不能对属性直接赋值的,要不然就是一个死循环了
            self.__dict__[attr]=value
        else:
            raise AttributeError,attr+'not find'

if __name__=='__main__':
    p=Person('007')
    print p.ID
    print p.Name  #这里会调用__getattr__,因为实例并没有注册Name这个属性。
    p.A=1 #设置一个未知属性,从而引发异常。

 

posted on 2015-11-13 09:18  蒋乐兴的技术随笔  阅读(387)  评论(0编辑  收藏  举报

导航