python基础之类的内置__setattr__,__delattr__,__getattr__和 二次加工标准类型(包装)
一、内置attr:__setattr__,__delattr__,__getattr__
- __setattr__ #添加/修改属性会触发它的执行
- __delattr__ #删除属性的时候会触发
- __getattr__ #只有在调用属性且属性不存在的时候才会触发
- class Foo:
- def __init__(self,x):
- self.name=x
- def __setattr__(self, key, value):
- # if not isinstance(value,str):
- # raise TypeError('must be str')
- # print('----setattr---key:%s,value:%s' %(key,value))
- # print(type(key))
- # print(type(value))
- # self.key=value
- # setattr(self,key_str,value) #self.key_attribute=value #这是无限递归
- self.__dict__[key]=value #因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值
- def __delattr__(self, item):
- print('delattr:%s' %item)
- print(type(item))
- # delattr(self,item) #这是无限递归
- # del self.item
- self.__dict__.pop(item) #我们可以直接修改属性字典,来完成添加/修改属性的操作
- f1=Foo('egon') #f1.name='egon'
- f1.age=18
- print(f1.__dict__)
- print(f1.name)
- print(f1.age)
- print(f1.__dict__)
- del f1.age
- print(f1.__dict__)
- print(f1.age)
- #---------------------getattr------------------------
- class Foo:
- def __init__(self,x):
- self.name=x
- #属性不存在的情况下才会触发
- def __getattr__(self, item):
- print('getattr-->%s %s' %(item,type(item)))
- f=Foo('egon')
- # print(f.name)
- print(f.xxxxxxx)
三板斧绝技
二、二次加工标准类型(包装)
包装:python默认提供了标准数据类型,以及丰富的内置方法,有时候需要基于标准数据类型来定制我们自己的数据类型,新增或改写方法,这就用到了继承和派生知识(标准类型均可以通过以下方式进行二次加工)
授权:授权是包装的一个特性, 包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品的功能。其它的则保持原样。授权的过程,即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性。
实现授权的关键点就是覆盖__getattr__方法
定制自己的数据类型:
- 继承的方式
- 授权的方式
- l=list([1,2,3])
- l.append(4)
- l.append('')
- print(l)
- class List(list):
- pass
- l1=List([1,2,3])
- print(l1)
- l1.append(4)
- print(l1)
- l1.append('')
- print(l1)
小例子
- #基于继承的原理,来定制自己的数据类型(继承标准类型)
- class List(list):
- def append(self, p_object):
- # print('--->',p_object)
- if not isinstance(p_object,int):
- raise TypeError('must be int')
- # self.append(p_object)
- super().append(p_object)
- def insert(self, index, p_object):
- if not isinstance(p_object,int):
- raise TypeError('must be int')
- # self.append(p_object)
- super().insert(index,p_object)
- #
- l=List([1,2,3])
- # print(l)
- # l.append(4)
- # print(l)
- # l.append('5')
- print(l)
- # l.insert(0,-1)
- l.insert(0,'-1123123213')
- print(l)
- # def test(x:int,y:int)->int:
- # return x+y
- # print(test.__annotations__)
- #
- # print(test(1,2))
- # print(test(1,'3'))
- #
- # def test(x,y):
- # return x+y
基于继承的原理,来定制自己的数据类型(继承标准类型)
- #不能用继承,来实现open函数的功能
- # f=open('a.txt','w')
- # print(f)
- # f.write('1111111')
- #授权的方式实现定制自己的数据类型
- import time
- class Open:
- def __init__(self,filepath,m='r',encode='utf-8'):
- self.x=open(filepath,mode=m,encoding=encode)
- self.filepath=filepath
- self.mode=m
- self.encoding=encode
- def write(self,line):
- print('f自己的write',line)
- t=time.strftime('%Y-%m-%d %X')
- self.x.write('%s %s' %(t,line))
- def __getattr__(self, item):
- # print('=------>',item,type(item))
- return getattr(self.x,item)
- #
- # f=Open('b.txt','w')
- # # print(f)
- # f.write('111111\n')
- # f.write('111111\n')
- # f.write('111111\n')
- f=Open('b.txt','r+')
- # print(f.write)
- print(f.read)
- res=f.read() #self.x.read()
- print(res)
- print('=-=====>',f.read())
- f.seek(0)
- print(f.read())
- # f.flush()
- # f.close()
授权的方式实现定制自己的数据类型
python基础之类的内置__setattr__,__delattr__,__getattr__和 二次加工标准类型(包装)的更多相关文章
- python基础----isinstance(obj,cls)和issubclass(sub,super)、反射、__setattr__,__delattr__,__getattr__、二次加工标准类型(包装)
一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否ob ...
- python 基础篇 15 内置函数和匿名函数
------------------------>>>>>>>>>>>>>>>内置函数<<< ...
- python基础之常用内置函数
前言 python有许多内置的函数,它们定义在python的builtins模块,在python的代码中可以直接使用它们. 常用的内置函数 类型转换 int python的整数类型都是int类型的实例 ...
- python基础学习笔记——内置函数
一. 简介 python内置了一系列的常用函数,以便于我们使用,python英文官方文档详细说明:点击查看, 为了方便查看,将内置函数的总结记录下来. 二. 使用说明 以下是Python3版本所有的内 ...
- python基础 (装饰器,内置函数)
https://docs.python.org/zh-cn/3.7/library/functions.html 1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使 ...
- python基础之反射内置方法元类
补充内置函数 isinstance(obj,Foo) # 判断obj是不是foo的实例 issubclass() # 判断一个类是不是另一个类的子类 反射 什么是反射? 通过字符串来操作 ...
- Python基础学习五 内置函数
1.函数补充: 1)函数返回值return可以有多个 2)补充示例: nums = [0,1,2,3,4,5,6,7,8] #如何将list里面的元素变为字符串类型 new_nums = [str(x ...
- Python 基础之常用内置函数
1.常用内置函数 (1)abs 绝对值函数 intvar = -9 res = abs(intvar)print(res) (2)round 四舍五入 (n.5 n为偶数则舍去 n.5 n为奇数 ,则 ...
- python基础学习Day14 内置函数 匿名函数
一.内置函数里几个高频重要函数 (1)min\max函数的用法 以min函数的为例: min:返回可迭代对象的最小值(可加key,key为函数名,通过函数的规则,返回最小值). l1 =[(,),(, ...
随机推荐
- Request介绍及演示样例 PART1
Request在ServletAPI的规范连接地址http://blog.csdn.net/zghwaicsdn/article/details/51035146 HTTP简介 URL是浏览器寻找信息 ...
- ios的设计原则
ios的设计原则 iOS设计的详细的主要宗旨例如以下: 1.易操作,所关心的主题清新 2.UI控件布局合理,图片质量清新 3.用户的使用习惯 4.字体的大小,主次分明 5.舒适的动画效果 在创建一个新 ...
- html-文本处理
文本处理-相关操作: <!-- 申明为html5版本 --> <!DOCTYPE html> <html> <head> <title>文本 ...
- PHP案例:学生信息管理系统
-- Database: test -- 表的结构 message CREATE TABLE `message` ( `id` tinyint(1) NOT NULL PRIMARY KEY AUTO ...
- angular 输入属性@Input , 输出属性@Output , 中间人模式
1 输入属性 通常用于父组件向子组件传递信息 举个栗子:我们在父组件向子组件传递股票代码,这里的子组件我们叫它app-order 首先在app.order.component.ts中声明需要由父组件传 ...
- windows下搭建ffmpeg+nginx+rtmp-module搭建实时视频环境
下载ffmpeg的Windows静态版: https://ffmpeg.zeranoe.com/builds/win64/static/下载nginx-rtmp-windows版:https://gi ...
- java语言中public、private、protected三个关键字的用法,重写和重载的区别。
java语言中public.private.protected三个关键字的用法,重写和重载的区别. 解答: 作用域 当前类 同包 子类 其它 public √ √ √ √ protected √ √ ...
- 【微信小游戏】文件系统,远程加载资源打破4M限制
一.前提 微信小游戏,对游戏包体的大小有严格是限制,上传文件大小<4M,但是本地缓存文件有50M空间,也就是说我们可以将一些资源放到网上,然后缓存到本地. 二.官方概念 文件系统 文件系统是小程 ...
- Docker for window 无法共享磁盘
Docker for window 无法共享主机磁盘,环境如下: 操作系统: windown10 Docker version 18.09.0, build 4d60db4 症状如下: 如图,点击ap ...
- Machine Learning Yearning - Andrew NG
链接(1~12章): https://gallery.mailchimp.com/dc3a7ef4d750c0abfc19202a3/files/Machine_Learning_Yearning_V ...