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 =[(,),(, ...
随机推荐
- hdu1243 最长公共子序列(LCS)
原题地址 题目分析 这道题基本上是在普通LCS问题上的一点小小的变形,由求LCS的长度,改为求LCS的权值.架构还是不变的.可作为LCS问题的模板题.时间复杂度O(N^2). 注意 题目中的字母都是小 ...
- Effective Java-第4章
第4章 类和接口 类和接口是Java程序设计语言的核心,它们也是Java语言的基本抽象单元.Java语言提供了许多强大的基本元素,供程序员用来设计类和接口. 13. 使类和成员的可访问性最小化 要区别 ...
- 设计模式_CallBack
一.基本概念 if you call me, i will call back 什么是回调函数 回调函数(callback Function),顾名思义,用于回调的函数. 回调函数只是一个功能片段, ...
- python学习之pypandoc
对于程序员来说,文件格式之间的转换是一件非常费劲的事!比如md文件转化为html文件. 于是乎,就有一群牛人搞出了个神器,他就是pandoc. 而python中,对应的第三方模块就是pypandoc. ...
- PHP学习笔记(14)班级和学生管理---学生
两个文件夹,一个班级cls,一个学生stu. 两个表,一个班级cls,一个学生stu. 每个文件夹里有7个php文件:主界面stu.php-------增add.php,insert.php----- ...
- iOS 新手引导页图片适配及其尺寸大全
早期新手引导页只需要几张图片就可以解决了,随着屏幕尺寸的的越来越多,新手引导页的尺寸适配起来越来越麻烦,否则就会出现尺寸不匹配,图片被拉伸的情况 目前应该是有2种方法来解决这个问题 方法1: 根据每款 ...
- Python-Scrapy创建第一个项目
创建项目 在开始爬取之前,您必须创建一个新的Scrapy项目.进入您打算存储代码的目录中,运行下列命令: scrapy startproject tutorial 1 该命令行将会创建包含下列内容的t ...
- Nexus 5 刷机 - Android 5.0 Lollipop
Nexus刷机 : 官方地址 刷机步骤 下载相应的安装包 连接USB 重启手机,进入BootLoader界面 : 使用命令 adb reboot bootloader 关机; 音量键下 + 电源键 ...
- RMAN Maintenance
CROSSCHECK: 确认 rman repository 与 实际的备份集 是否同步. 你可以先使用 LIST 命令查看你之前做的备份的情况, 然后使用 CROSSCHECK 命令来确认这些文件还 ...
- 日期类Date
Java在日期类中封装了有关日期和时间的信息,用户可以通过调用相应的方法来获取系统时间或设置日期和时间.Date类中有很多方法在JDK1.0公布后已经过时了,在8.3中我们将介绍JDK1.0中新加的用 ...