#__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__中的#11print(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) """
时间: 2024-10-12 12:28:30