码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-08-13 00:44:34      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:计算   重写   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!