# 1、基于授权定制自己的列表类型,要求定制的自己的__init__方法, # 2、定制自己的append:只能向列表加入字符串类型的值, # 3、定制显示列表中间那个值的属性(提示:property), # 4、其余方法都使用list默认的(提示:__getattr__加反射)。 class List: def __init__(self,type,default=[]): #输入需要列表的数据类型,如果不想输入的话,默认为空列表。 self.type=type self.res=default #这一步需要调用property下面的res函数。 @property def res(self): return self.__res #这下返回的是self.__res,将self.res封装了起来。 @res.setter def res(self,value): #定义setter,在实例的定义阶段就调用,因为property的优先级大于对象自己的数据属性,限制输入的类型必须为list。 if not isinstance(value,list): raise TypeError("输入类型不对!") self.__res=value #这时赋值给self.__sex。 def append(self,value): #定义函数,判断输入的值类型是不是规定的。 if not isinstance(value,self.type): raise TypeError("输入类型不对!") self.__res.append(value) #加到列表中。 @property def midtype(self): #这是查看中间值的属性,可以直接用了就。 return self.res[int(len(self.__res)/2)] def __getattr__(self, item): #在对象找不到将要调用的属性时,会触发这个函数的运行。 return getattr(self.__res,item) #return的是self.res即列表类型授权的方法。 def __str__(self): #这是在打印a的时候,return的是一个字符串,而不是让人看不懂的对象内存地址。 return "%s"%self.__res # a=List(str,[1,2,3]) # print(a.type) # print(a.res) # print(a.midtype) # a.append("bbbbbbbbbb") # print(a) # a.insert(0,"aaaaaaaaaa") # print(a)