Python3基础-组合方式完成授权、继承方式完成包装

#super() 函数是用于调用父类(超类)的一个方法
class A:
    def add(self, x):
        y = x + 2
        print(y)

class B(A):
    def add(self, x):
        super().add(x)
        print('BBBBBB')

b = B()
b.add(2)
"""
执行结果如下
4
BBBBBB
"""
#继承的方式完成包装,包装是一个类型通常是对已存在的类型一些定制。可以新建、修改、删除原有产品的功能,其他的则保持原有的功能
class MyList(list):
#重写list中的append类型
def append(self,value): #覆盖父类 if type(value) is str: #判断,只有str类型才能追加到list里面 super().append(value) else: print('只能存储str类型!') #list() slist= list('hello world') print(slist,type(slist)) #Mylist() mlist = MyList('hello world') print(mlist,type(mlist)) mlist.append(18) mlist.append('18') print(mlist) """ 执行结果如下: ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'] <class 'list'> ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'] <class '__main__.MyList'> 只能存储str类型! ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '18'] """
#授权,授权是包装的一个特性
#授权的过程,即是所有更新的功能都是由新类的某部分来处理,但是已存在的功能就授权给对象的默认属性
#实现授权的关键点就是覆盖__getattr__方法
import  time
class Open():
    def __init__(self,filename,mode='r',encoding='utf-8'):
        self.file = open(filename,mode,encoding=encoding)  #组合的方式,实例化open方法为:file
        self.mode = mode
        self.encoding = encoding

    def __getattr__(self, item):
        return  getattr(self.file,item)
    #这句话就可以用作授权;如果你没有重写方法,就会去找原有方法;
    #如果写了,就不会触发该函数;而是直接用重写的方法,下面重写write举例
    def write(self,item):
        #重写文件write方法,要求每实现一次write,都要在内容后面加上时间
        wtime = time.strftime('%b %d %Y %H:%M:%S')
        self.file.write("%s%s"%(item,wtime))
f1 = Open('a.txt','w+',encoding='utf-8')
f1.write('调用重新写的方法\n')
f1.seek(0) #启动__getattr__ 寻找原来的seek()方法
value = f1.read()  #启动item = f1.read()  #启动read()方法
print(value)
f1.close()
"""
执行结果如下:

调用重新的方法
Nov 18 2019 16:42:49

"""

 

posted @ 2019-11-18 16:48  槑槑DE  阅读(137)  评论(0编辑  收藏  举报