标签:计算 重写 attr 结果 赋值 不能 没有 定义 自动
# 二次加工系统的标准类型 # 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__方法
标签:计算 重写 attr 结果 赋值 不能 没有 定义 自动
原文地址:https://www.cnblogs.com/dangrui0725/p/9465464.html