爱根,深沉。。。基于授权定制列表类型!

# 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)
原文地址:https://www.cnblogs.com/chedanlangren/p/6759376.html