包装和授权

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

举个例子

# 举个例子
import time
class FileHandle:def __init__(self,filename,mode='r',encoding='utf-8'):self.file=open(filename,mode,encoding=encoding)def write(self,line):t=time.strftime('%Y-%m-%d %T')self.file.write('%s %s' %(t,line))def __getattr__(self, item):return getattr(self.file,item)f1=FileHandle('b.txt','w+')
f1.write('你好啊')
f1.seek(0)
print(f1.read())
f1.close()

  

# 练习一:重写自定制列表的append和insert方法

class List(list):def append(self,object:str):if not isinstance(object,int):raise TypeError("must int")super().append(object)def insert(self, index: int, object):if not isinstance(object,int):raise TypeError("must int")super().insert(index,object)l=List([1,2,3])
print(l)
# [1, 2, 3]
l.append(4)  #会调用类本身的append方法
print(l)
# [1, 2, 3, 4]# l.append("hello")  我们重写了append方法,要求他只能接受int
# raise TypeError("must int")l.insert(0,-1)  #第一个0是索引,必需是int,第二个规定是int
# l.insert(0,"hello")  #报错,因为我们重写了增加和插入方法,非int类型插入报错,必须是int类型
print(l)
# [-1, 1, 2, 3, 4]

  

# 练习二:根据需求自定制列表

# 练习:
#   定制自己的列表类型,要求定制的自己的__init__方法,
#   定制自己的append:只能向列表加入字符串类型的值
#   定制显示列表中间那个值的属性(提示:property)
#   其余方法都使用list默认的,比如insert()可以插入数字(提示:__getattr__加反射)# 练习二
class List:def __init__(self, seq):self.seq = seqdef append(self, p_object):' 派生自己的append加上类型检查,覆盖原有的append'if not isinstance(p_object, str):raise TypeError('must be str')else:self.seq.append(p_object)@propertydef mid(self):'新增自己的方法'index = len(self.seq) // 2return self.seq[index]# 没有该属性时候的处理方式,自动调用__getattr__,自动调用原列表insert方法# 注意此处,因为是对象的属性是self,但是getattr里面的是自己定制的init,self.seq,否则造成递归def __getattr__(self, item):print("传入__getattr__:",self.seq,item)return getattr(self.seq, item)# 造成递归# def __getattr__(self, item):#     return getattr(self,item)def __str__(self):return str(self.seq)x = ['h', 'e', 'l', 'l']
l = List(x)
print(l)
# ['h', 'e', 'l', 'l']# 实现取特定数据类型的添加
l.append('o')
print(l)
# ['h', 'e', 'l', 'l', 'o']# 实现取中间值方法
print(l.mid)
# l# 其余方法用默认的,比如insert
l.insert(0, -123)
print(l)
# 传入__getattr__: ['h', 'e', 'l', 'l', 'o'] insert  列表序列和方法
# [-123, 'h', 'e', 'l', 'l', 'o']

  

练习三:权限与列表

# 练习三
class List:def __init__(self, seq, permission=False):self.seq = seqself.permission = permissiondef clear(self):if not self.permission:raise PermissionError('not allow the operation')self.seq.clear()def __setattr__(self, key, value):if not self.permission:raise PermissionError('not allow the operation')else:self.__dict__[key] = valuedef __setattr__(self, key, value):if not isinstance(value, str):raise TypeError("must be str")self.__dict__[key] = valuedef __delattr__(self, item):self.__dict__.pop()def __str__(self):return str(self.seq)l = List([1, 2, 3])
# l.clear() #此时没有权限,抛出异常l.permission = True
print(l)
l.clear()
print(l)# 基于授权,获得insert方法
l.insert(0, -123)
print(l)

  

转载于:https://www.cnblogs.com/adamans/articles/7517442.html

python进阶-面向对象编程四:包装授权和自定制列表某些方法相关推荐

  1. Python 进阶 — 面向对象编程

    目录 文章目录 目录 面向对象思想 面向对象编程 面向对象编程的特性 封装 继承 多态 面向对象编程的优势 Python 的类属性与类方法 Python 类的实例化 Python 的对象属性与对象方法 ...

  2. Python基础十五:面向对象编程四:高级特性

    Python基础十五:面向对象编程四:高级特性 Python基础系列内容为学习廖雪峰老师Python3教程的记录,廖雪峰老师官网地址:廖雪峰Python3教程 Author:yooongchun Em ...

  3. python用类名直接调用方法_一文读全 Python 的面向对象编程方法

    背景介绍: Python 支持三种形式的编程,分别是:"命令式"."函数式"和"面向对象式". 很多优秀的开源 Python 项目里都用到了 ...

  4. python进阶 多线程编程 —— threading和queue库实现多线程编程

    python进阶 多线程编程 -- threading和queue库实现多线程编程) 摘要 多线程实现逻辑封装 模型参数选择实例 摘要 本文主要介绍了利用python的 threading和queue ...

  5. Python进阶-----面向对象2.0(特有属性和方法与私有属性和方法)

    目录 前言: 1.添加特有属性/方法 示例1:添加特有属性 示例2:添加特有方法 2.私有属性/方法 (1)私有化示例 (2) 私有化属性/方法可以在类的内部使用 (3)强制访问私有化属性/方法 (4 ...

  6. Python进阶之使用Scrapy实现自动登录Github的两种方法(POST,FormRequest,from_response)

    Python进阶之使用Scrapy实现自动登录Github的两种方法 1. 通过.FormRequest()实现登录github github1.py 2. 通过.FormRequest.from_r ...

  7. python基础 面向对象编程

    目录 面向对象编程 1.什么是面向对象编程? 面向过程编程思想 面向对象编程思想 2.什么是类?如何定义. 类: 对象 3.如何产生对象? 调用类时的事件: 4.对象属性的查找顺序: 5.类内部的函数 ...

  8. python之面向对象编程

    最近阅读到了一篇关于面向对象编程和面向过程编程解释说明的文章,觉得写的通俗易懂.文章链接如下: 漫画:如何通俗易懂地解释面向对象思想? 但是该文章举的例子是用Java,故在此我按照我的理解,针对pyt ...

  9. Python 基础--面向对象编程

    在至今我们编写的所有程序中,我们曾围绕函数设计我们的程序,也就是那些能够处理数据的代码块.这被称作*面向过程(Procedure-oriented)*的编程方式.还有另外一种组织起你的程序的方式,它将 ...

最新文章

  1. [转载]对 Linux 新手非常有用的20个命令
  2. xcode:关于Other Linker Flags
  3. Java线程池示例:任务窃取线程池WorkStealingPool
  4. linux 复制文件或者文件
  5. 使用IDA Pro动态调试SO文件
  6. OSSchedLock()--上锁函数
  7. SQL常用的几个窗口函数
  8. 大前端的自动化工厂(3)—— babel
  9. React.js 小书 Lesson18 - 挂载阶段的组件生命周期(一)
  10. php 不支持curl 的解决方案
  11. welearn视听说 读写 答题助手 综合插件
  12. 高淇java300适合_高淇java300集JAVA面向对象的进阶作业
  13. Python练习(一)
  14. python将html转成pdf,python将html转成PDF的示例
  15. 筋斗云接口编程 / 常用操作(二)
  16. iOS开发之 简易随机点名册的设计
  17. “干爹”这事是怎么在北美洗白白的
  18. CSS语法及其选择器
  19. 理解ASAN的shadow memory和读懂报错信息
  20. 商汤绝影车路协同“进城”!10+个智能网联应用,100+场景算法应用,感知范围扩大1000倍...

热门文章

  1. Android.mk文件的解析
  2. php发送验证图片,php生成图片验证码_PHP教程
  3. Java语言语法语义分析器设计与实现
  4. Blueprint 使用手记
  5. Spring使用注释
  6. 控制面板的cpl程序列表
  7. Docker Inspect
  8. 穷举 百文百鸡
  9. 天气预报API使用心得
  10. poj 1077 Eight(A*)