二次加工系统的标准类型 包装与授权

# 二次加工系统的标准类型
# 1、通过继承系统的类来完成包装, 定制自己的数据类型

class List(list):  # 定义了一个List类,继承自系统中的list类
    def append(self, p_object):  # 重写了append方法,改为只能添加字符串
        if type(p_object) is str:
            super().append(p_object)  # 因为重写了append,这里要使用原append方类时需要调用父类的append方法,使用super()调用
        else:
            print('只能添加字符串类型')

    def show_middle(self):  # 定义了一个新的方法,用于查找列表中中间的那一个元素
        mid_index = int(len(self) / 2)  # 计算出中间元素的index值
        return self[mid_index]  # 返回中间的元素


l1 = List('HelloWorld')  # 使用我们定义的List类创建列表
l1.append(1111)  # 当append的元素为数字时,不能添加成功,提示只能添加字符串类型
l1.append('ok')  # 只有append字符串时,才能添加成功

print(l1.show_middle())  # 打印自己定义的show_middle方法返回的结果

# 2、授权:也是一种包装,但不是通过继承来做,而是通过覆盖__getattr__来做
import time


class Open:
    def __init__(self, filename, mode='r', encoding='utf-8'):
        self.file = open(filename, mode, encoding=encoding)  # 获取打开文件的句柄赋值给self.file
        self.mode = mode
        self.encoding = encoding

    def write(self, content):  # 我们定义了一个write方法
        t = time.strftime('%Y-%m-%d %X')  # 定义了一个时间显示格式
        self.file.write('%s %s' % (t, content))  # 写入内容时自动加上时间

    def __getattr__(self, item):  # 相当于def __getattr__(f1实例对象, 'read'):
        return getattr(self.file, item)  # 通过getattr返回self.file, item的内存地址并return


f1 = Open('1.txt', 'r+')

f1.write('111111111\n')  # 这里调用的是我们自己定义的write方法
f1.write('222222222\n')
f1.write('333333333\n')

print(f1.read())  # 因为f1的实例及父类Open中没有read属性,所以会执行 __getattr__方法

猜你喜欢

转载自www.cnblogs.com/dangrui0725/p/9465464.html