一、包装:对已存在类的部分功能进行新建、修改或者删除,其它保持原样

   主要通过继承实现

 

class List(list):

    # 修改append方法,限制只能添加字符串类型
    def append(self, p_object):
        if type(p_object) is str:
            super().append(p_object)  # 调用父类的append方法
        else:
            print("只能添加字符串类型")

    # 新增求中间值的功能
    def show_middle(self):
        mid_index = int(len(self) / 2)
        return mid_index


l = List("helloworld")
print(l)
l.append("fff")
l.append(45678)
print(l)

print("列表中间值:",l.show_middle())

  运行结果

 

['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']
只能添加字符串类型
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', 'fff']
列表中间值: 5

 

二、授权:将已存在的类的属性通过组合的方式(实例参数是一个对象)授权给新类,新类中已定义的属性用自己的,未定义的属性则使用已存在类的,

  主要使用组合、__getattr__、getattr()实现

 

import time


class FileHandle:

    def __init__(self, filename, mode="r", encoding="utf-8"):
        self.file = open(filename, mode, encoding=encoding)
        self.mode = mode
        self.encoding = encoding

    # 在类中定义了write方法,实现每次写入前加上时间
    #
    def write(self, data):
        now = time.ctime()
        self.file.write("%s %s" % (now, data))

    # 如果没有找到属性,则触发执行该函数。
    def __getattr__(self, item):
        return getattr(self.file, item)  # 使用字符串找属性,返回内置open类的属性


# 实例化
f = FileHandle("a.txt", "w+")
f.write("开始运行\n")  # FileHandle中定义了该方法,则用自己的
f.write("运行良好\n")
f.write("运行结束\n")
d = f.read()
print(d)
f.close()

fr = FileHandle("a.txt", "r")
d = fr.read()  # 在FileHandle中没有定义,则使用内置类open的read
print(d)
fr.close()

 

 

 

   运行结果

Tue Nov 19 11:29:29 2019 开始运行
Tue Nov 19 11:29:29 2019 运行良好
Tue Nov 19 11:29:29 2019 运行结束