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)
标签:__,seq,python,self,加班,标准型,print,clear,def 来源: https://www.cnblogs.com/liuxu2019/p/12115934.html