ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-12-29 19:00:54  阅读:268  来源: 互联网

标签:__ seq python self 加班 标准型 print clear def


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

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

继承的方式

  • 只要重写自己想要修改的方法属性即可,所有的操作通过对象直接调用,此时需要注意无限循环,可以使用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)

标签:__,seq,python,self,加班,标准型,print,clear,def
来源: https://www.cnblogs.com/liuxu2019/p/12115934.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有