#__setattr__ 赋值方法,即一旦遇到self.name=name,就会执行__setattr__方法
#__delattr__ 删除方法,一旦遇到del self.name,就会执行__delattr__方法
#__getattr__ 查询方法,一旦遇到res=self.name,取res的值,且self.name不存在时,
#就会执行__getattr__方法.它与__setattr__和__delattr__不同.
#attr系列与property的区别,
#1.attr系列是定义在类中的函数,property是给定义在类中的函数做装饰器用
#2.attr系列可以是对象的任何属性,但是property只能是被它装饰的函数
#3.表现形式不一样,attr系列是__setattr__,__delattr__,__getattr__
#property是,以sex()函数为例,@sex.setter,@sex.deleter,@property
#attr系列的使用:
#__setattr__(self,key,value) 在其定义的函数中赋值使用self__dict[key]=value
#__delattr__(self,item)在其定义的函数中删除使用del self__dict[key]
#__getattr__(self,item)在其定义的函数中查询,一般使用getattr(self,item)
#注:这里的方法是指会自动传值的函数
class Foo:
def __init__(self,name): #2
self.name =name #即给self.name进行赋值,就会自动执行__setattr__方法
def __setattr__(self, key, value):#3
if not isinstance(value,str):#判断value的类型是否是str型
raise TypeError('must be str')#主动抛出异常,整个程序结束
print('----setattr---key:%s,value:%s'%(key,value))
print(type(key))
# self.key(属性) = value #相当于setattr(self,key(字符串),vlaue)
# setattr(self,key,value)相当于给self.key(属性)进行赋值,就会自动执行
#__setattr__方法,所以进入一个死递归,即不能用该方法进行赋值.
self.__dict__[key] =value#直接在self.__dict__字典中进行赋值
def __delattr__(self, item): #12
print('delattr:%s' %item)
print(type(item))
# delattr(self,item) #相当于del self.item(属性)
# del self.item
self.__dict__.pop(item)#相当于del self.__dict__[item]
f1 =Foo('egon')#类的实例化,会自动执行__init__方法(如果有),运行__init__中的代码#1
f1.age = '18'
print(f1.__dict__)#f1的名称空间以字典的形式储存的
del f1.age #删除f1.age,就会执行__delattr__方法(如果有),运行__delattr__中的#11
print(f1.__dict__)
"""
class Foo:
def __init__(self,x):
self.name =x
#属性不存在的情况下才会触发
def __getattr__(self, item):
print('getattr--->%s %s'%(item,type(item)))
f =Foo('egon')
#print(f.name)
print(f.xxxx)
"""
转载于:https://www.cnblogs.com/IQ-Python/p/6758444.html