python-二次加班标准型(包装)

二次加工标准类型(包装)

二次加工标准型中有两种方式定制自己的数据类型:继承的方式/授权的方式

继承的方式

  • 只要重写自己想要修改的方法属性即可,所有的操作通过对象直接调用,此时需要注意无限循环,可以使用super()的方式避免出现死循环;
# 继承
class List(list):
    def __init__(self,item,tag=False):
        super().__init__(item)
        self.tag=tag
    def append(self, p_object):
        if not isinstance(p_object,str):
            raise TypeError
        super().append(p_object)
        # self.append(p_object) 报错,无限循环
    def clear(self):
        if not self.tag:
            raise PermissionError
        super().clear()

l=List([1,2,3],False)
print(l)
print(l.tag)

l.append('saf')
print(l)

# l.clear() #异常

l.tag=True
l.clear()

授权的方式

  • 使用授权的方式时,需要重写__init__方法,给对象增加一个特征属性,所有的操作表面是通过对象使用点方式直接调用方法,其实是通过对象的这个特征属性来调用修改或新增的方法。当调用没有被修改的方法时也是通过这个这个特征属性操作的,此时是通过__getattr__触发的。所谓授权,就是说给予这个特征属性权利来帮对象调用相关方法
# 授权
class List:
    def __init__(self,seq,permission=False):
        self.seq=seq
        self.permission=permission
    def clear(self):
        if not self.permission:
            raise PermissionError('not allow the operation')
        self.seq.clear()

    def __getattr__(self, item):
        return getattr(self.seq,item) 
        # 没有修改的功能,通过__getattr__在原数据类型中调用

    def __str__(self):
        return str(self.seq)
l=List([1,2,3])  #传进来的参数是列表,授权的就是列表的相关方法
# l.clear() #此时没有权限,抛出异常


l.permission=True
print(l)
l.clear()
print(l)

#基于授权,获得insert方法
l.insert(0,-123)
print(l)

猜你喜欢

转载自www.cnblogs.com/liuxu2019/p/12115934.html
今日推荐