包装和授权

python的包装和授权

包装:python为大家提供了标准数据类型,以及丰富的内置方法,其实在很多场景下我们都需要基于标准数据类型来定制我们自己的数据类型,新增/改写方法,这就用到了我们刚学的继承/派生知识(其他的标准类型均可以通过下面的方式进行二次加工)

# 包装(二次加工标准类型)
# 继承 + 派生 的方式实现 定制功能
1、重新定义append方法
2、定制新的功能
class List(list):
    def append(self,object): #append类型必须是字符串
        if type(object) is str:
            print("正在添加[%s]"%object)
            #list.append(self,object)#调用父类方法
            super().append(object)
        else:
            print("必须是字符串类型")
    def show_midlle(self):   #取传入值得中间字符
        mid_index = int(len(self)/2)
        return self[mid_index]
f1 = List("helloworld")
f1.append("SB")
print(f1)
f1.append(2222222)
print(f1.show_midlle())

授权:授权是包装的一个特性, 包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品的功能。其它的则保持原样。授权的过程,即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性。

实现授权的关键点就是覆盖__getattr__方法

#组合的方式继承了open函数的所有特性
class FileHandle:
    def __init__(self,filename,mode = "w",encoding = "utf-8"):
        self.file = open(filename,mode,encoding=encoding)
        self.mode = mode
        self.encoding = encoding
    def __getattr__(self,item):
        return getattr(self.file,item)
f1 = FileHandle("a.txt")
f1.write("1111\n")
#组合的方式定制写的方法
import time
class FileHandle:
    def __init__(self,filename,mode = "a+",encoding = "utf-8"):
        self.file = open(filename,mode,encoding=encoding)
        self.mode = mode
        self.encoding = encoding
    def write(self,len):
        t = time.strftime("%Y-%m-%d %X")
        self.file.write("%s %s"%(t,len))
    def __getattr__(self,item):
        return getattr(self.file,item)
f1 = FileHandle("a.txt")
f1.write("cpu负载过高\n")
f1.write("内存剩余不足\n")
f1.write("硬盘剩余不足\n")

#在写内容的开头加上时间

原文地址:https://www.cnblogs.com/NumerOne/p/11465190.html

时间: 2024-11-13 04:03:22

包装和授权的相关文章

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

# 二次加工系统的标准类型 # 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()调用 els

Python包装授权

1.什么是包装 # -*- coding : utf-8 -*- """     包装类,就是给被包装的类加个壳:被包装内实现壳的内部,而包装内提供壳的外部(接口),有点类似于继承关系,     不过也不完全时,因为通过继承也可以实现包装效果,不使用继承同样可以实现包装效果.下面通过一个例子来展示     包装的概念 """ class PackageList(object):     "包装List类型,使用非继承实现"  

python核心编程--笔记

python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   冗余输出(导入语句详细追踪) 1.5 –m mod 将一个模块以脚本形式运行 1.6 –Q opt 除法选项(参阅文档) 1.7 –c cmd 运行以命令行字符串心事提交的python脚本 1.8 file   以给定的文件运行python脚本 2 _在解释器中表示最后

python自动化开发-[第八天]-面向对象高级篇与网络编程

今日概要: 一.面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) 2.__setattr__,__getattr__,__delattr__ 3.二次加工标准类型(包装/授权) 4.__setitem__,__getitem__,__delitem__ 5.__str__,__repr__,__format 6.__next__,__iter__实现迭代器协议 7.__doc__ 8.__del__析构函数 9.__enter__,__exit

Python面向对象之反射

首先,我们来看两个内置函数,isinstance和issubclass,前者是判断一个对象是不是相应的类型,比如: obj = 'python' print(isinstance(obj,str)) 判断obj是否为字符串类型,结果返回True 后者issubclass则判断一个类是否为另一个的子类,比如: class A:     pass class B(A):     pass print(issubclass(B,A)) 判断B是否为A的子类,结果返回True 反射:其实它的核心本质其实

pthon核心编程-读书笔记:知识点摘录与总结(方便理解和快速记忆)

Python 中的列表(大小可变的数组)和字典(哈希表)就是内建于语言本身的.在核心语言中提供这些重要的构建单元,可以鼓励人们使用它们, 缩短开发时间与代码量,产生出可读性更好的代码.C不提供, c++功能不够简洁. 面向对象, 可升级:Python 提倡简洁的代码设计.高级的数据结构和模块化的组件,确保灵活性. 一致性并缩短必要的调试时间 扩展性:兼容扩展c和java 易读写,易维护 健壮性:Python 提供了"安全合理"的退出机制, Python由于错误崩溃,解释程序就会转出一个

Python之旅(八)面向对象02

isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 issubclass(sub, super)检查sub类是否是 super 类的派生类(子类) class Animal(): pass class Dog(Animal): pass d1 = Dog() # 检查d1是不是Dog的一个对象 print(isinstance(d1, Dog)) print(issubclass(Dog

python类 包装 授权

"包装"是指对一个已经存在的对象进行系定义加工. 实现授权是包装的一个特性.包装一个类型通常是对已存在的类型进行一些自定义定制,这种做法可以新建,修改,或删除原有产品的某些功能,而其他的保持不变.授权的过程,其实也就是所有的更新功能都交给新类的自定义的某部分功能来处理,但已存在的功能就授权给对象的默认属性. 实现授权的关键点是覆盖__getattr__()方法,在代码中包含一个对getattr()内建函数的调用,调用getattr()得到默认对象的属性,并返回它以便访问或者调用. 用组

包装特性之----授权

授权:授权是包装的一个特性,包装一个类型通常是对已存在的类型的一些定制, 这种做法可以新建,修改或删除原有产品的功能.其它的则保持原样.授权的过程, 即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性. 实现授权的关键点就是要覆盖__getattr__方法 class FileHandle: def __init__(self,filename,mode = 'r',encoding = 'utf-8'): self.file = open(filename,mod