设置对象属性
死循环(超过1000报错) def __setattr__(self,name,value): setattr(self.name,value) 正确的调用方法 def __setattr__(self,name,value): self.__dict__[name] = value __getattr__(self,name): __getattribute__(self,name):每次调用都会执行,容易递归 __delattr__(self,name)删除属性
__setattr__
aaaaa
class Programer(object):
"""docstring for Programer"""
def __init__(self, name,age):
super(Programer, self).__init__()
self.name = name
self.age = age def __getattribute__(self,name): #return getattr(self,name) #错误写法,会引起无限递归 #return self.__dict__[name] #错误写法,会引起无限递归 return super(Programer,self).__getattribute__(name) #正确 def __setattr__(self,name,value): #setattr(self,name,value) #错误写法,会引起无限递归 self.__dict__[name]=value #正确 if __name__=='__main__': p=Programer('lrf',25) print(p.name)
避免注释掉的三个错误写法,会造成无限递归。
dfdsafd
def __setattr__(self,name,value):
setattr(self,name,value)
错误的原因是会导致无限的循环,而Python只有循环1000次。
Python中的内置函数,不可以直接用于类,但是大部分可以通过简单的魔术方法进行定义,然后就可以直接调用了。
设置对象属性
def __setattr__(self, name, value):
self.__dict__[name] = value
查询对象属性
__getattr__(self,name):默认情况没有被查询这个情况下会调用
__getattribute__(self, name):每次访问属性就会被调用到,注意容易 引起无限递归
删除对象属性
__delattr__(self, name):
set attribute
def __setattr_(self, name, value): self.__dict__[name]=value
设置对象属性:通常不必定义,调用从父类继承的方法
def __setattr__(self, name, value): self.__dict__[name] = value
查询对象属性:
__getattr__(self, name):访问属性在默认情况下没有被查询到的情况下调用
__getattribute__(self, name):每次访问属性一定会调用,容易引起无限递归,最好调用父类的getattribute
删除对象属性
__delattr__(self, name)
class Programer(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __getattribute__(self, name):
return super(Programer, self).__getattribute__(name)
def __setattr__(self, name, value):
self.__dict__[name] = value
if __name__ = '__main__':
p = Programer('Albert', 25)
print n.name
def __getattribute__(self, name):
return super(Programer, self).__getattribute__(name)
def __setattr__(self, name, value):
self.__dict__[name] = value
__setattr__,__getattribute__无限递归
def __setattr__(self, key, value): # setattr(self, key, value) self.__dict__[key] = value def __getattribute__(self, item): # return getattr(self, item) # RuntimeError: maximum recursion depth exceeded # return self.__dict__[item] return super(Magic, self).__getattribute__(item) def __getattr__(self, item): return "no attr %s" % item
注释的都是错误的
__getattr__ 是获取不到属性的时候才会被调用的.
__getattribute__ 每次都会被调用

设置对象属性:
查询对象属性:

__getattr__:不是每次调用,查询不到时调用
__getattribute:每次都调用