一、包装:对已存在类的部分功能进行新建、修改或者删除,其它保持原样
主要通过继承实现
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 运行结束