#-*-coding:utf-8-*-'''_slots_类属性1._slots_是一个类变量,可以由一系列对象组成,使用所有合法标识构成的实例属性的集合表示,它也可以是一个列表,元组,或可迭代对象,总之,任何试图创建一个其名不在_slots_中的实例属性的操作都将引发AttributeError异常'''class MyLimeter(object): #MyLimeter是以object类为超类的。在__slots__类属性中,定义3个属性'myname','myage','myhoppy' __slots__ = 'myname','myage','myhoppy'# if __name__ =='__main__':# #创建类实例# x = MyLimeter()# #调用属性,由于在实例属性被引用前必须赋值,所以会报错# # x.myname# #给属性赋值,__slots__类属性会防止用户随心所欲地动态添加实例属性,所以会报错# # x.job = '白领'# #修改代码# x.myname = 'duochunyuan'# print(x.myname)'''__getattribute__()特殊方法(只适用于新式类)当属性不能再实例的__dict__,类的__dict__或者__dict__中找到时才被调用适用情况:想要一个适当的函数来执行对每个属性的访问,而不仅仅是属性找不到的情况,这就需要使用__getattribute__()方法代码描述:当实例对象myattribute访问属性member时,调用__getattribute__方法,并且判断该属性是否为test,很显然不是,则执行else代码块。由于属性member在类MyAttribute中存在,因此没有调用__getattr__方法中的内容。当实例对象myattribute访问属性so时,又一次调用__getattribute__方法,进入__getattribute__方法后进行判断并且执行相应的代码,由于属性so在MyAttribute类中不存在,因此调用__getattr__方法。在__getattr__方法中,当执行到self.default时,又调用了一次__getattribute__方法,接着再次判断,并且执行else块中的代码,最后进行打印输出'''class MyAttribute(object): def __init__(self): self.default = 0.0 self.age = 20 self.member = 21 #使用__getattribute__方法来确定是不是对每个属性的访问都需要调用该方法,并且在该方法中使用if语句判断调用的属性是否为test,如果是则执行相应的代码块 def __getattribute__(self, name): if name == 'test': print('当调用的属性不是test时,经过__getattribute__方法%s'%name) return self.test else: print('当调用的属性不是test时,打印输出的值%s'%name) return object.__getattribute__(self,name) #__getattr__方法来确定所创建的实例调用的属性是否在类中,若是不在会调用 def __getattr__(self, name): print('经过__getattr__方法,打印输出的name值是:%s'%name) print('打印出的原先设置的default值:%s'%self.default) return self.defaultif __name__ == '__main__': myattribute = MyAttribute() myattribute.member myattribute.so'''描述符(新式类)它为对象属性提供强大的API,其原理就是将某种特殊类型的类的实例指派给另一个类的属性包含的方法有__get__()、__set__()和__delete__()__get__()用于得到一个属性的值__set__()为一个属性赋值__delete__()采用del语句或者明确删除某个属性时被调用'''class MyDescription(object): def __get__(self, obj, typ=None): print('__get__方法,oby是:%r,typ是:%r'%(obj,typ)) return self.data def __set__(self, obj, val): print('__set__方法,oby是:%r,val是:%r'%(obj,val)) self.data = val def __delete__(self, obj): print('__delete__方法,obj是%r'%obj) del self.dataclass MyDesClass(object): this = MyDescription() that = MyDescription() other = 4mydesclass = MyDesClass()mydesclass.this = 'nishiwodeweiyi'print(mydesclass.this)print('我是打印出类MyDesClass中other的值:',mydesclass.other)mydesclass.other = 6print('我是打印出重新赋值给other的值:',mydesclass.other)
转载于:https://www.cnblogs.com/askill/p/10213250.html