# 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)