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

python中__getattribute__与__getattr__调用时的区别

2012-07-12 17:29 399 查看
"__getattribute__"方法小结:

1. 任何调用类的属性行为都将从"__getattribute__"开始调用。

2. 在"__getattribute__"中调用该函数自身属性,将会导致无限循环,应该借用object对象再调用其本身。所以如果要在自定义类中重写"__getattribute__"方法,首先该自定

义类必须继承object对象,然后借用object对象再调用其本身返回属性值: return object.__getattribute__(self, name),如果直接调用__getattribute__(self, name)则会

无限递归

以如下两个例子来说明:

--------------------ex1:--------------------

class User(object): # 必须继承object

def __init__(self):

self.Id = 0

def def __getattribute__(self, name):

print 'get '+name

return object.__getattribute__(self, name) # 正常返回属性值 --借用object对象再调用其本身

u=User()

u.Id = 1

print u.Id

---------输出

'get Id '

'1'

----------------------------ex2:---------------------------

class User(object): # 必须继承object

def __init__(self):

self.Id = 0

def def __getattribute__(self, name):

print 'get '+name

return self.__getattribute__(self, name) # 陷入无限递归

u=User()

u.Id = 1

print u.Id

---------输出

'get __getattribute__'

'get __getattribute__'

'get __getattribute__'

'get __getattribute__' . . .. . . . . . .. ..

"__getattr__"方法小结:

1. "__getattr__"将会在寻找不到合适的函数或者属性时作为默认被调用到。

class User(object): # 必须继承object

def __init__(self):

self.Id = 0

def def __getattribute__(self, name):

print 'get '+name

return object.__getattribute__(self, name)

def def __getattr__(self, name):

print 'getattr '+name

return self.__dict__.get(name)

u=User()

print u.Id2

---------输出

'get Id2'

'getattr Id2'

None
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: