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 =[(,),(, ...
随机推荐
- Vivado的helloword程序:软件工程部分
建立工程 Export结束后,会自动启动SDK.界面如下.可以看到工程浏览器Project Explorer中已经有一个硬件平台hw_platform_0,里面有一系列配置和初始化文件.不要修改这些文 ...
- 【问题记录】shiro logout UnknownSessionException
问题描述:web项目中使用shiro做登录权限控制,当shiro执行logout后,直接返回一个jsp路径会抛出org.apache.shiro.session.UnknownSessionExcep ...
- Jquery学习笔记(2)--五角星评分
网购五星评分模拟: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- VirtualBox错误ID: PAEmode解决
今天在导入virtualbox的虚拟机ubuntu系统时,报错,无法打开虚拟机 报错内容如下: 错误 ID: PAEmode 严重: 致命错误 The guest is trying to switc ...
- JavaScript绘图类 (DIV绘图)
主要的图形算法抄自一个叫w_jsGraphics.js的类库,第一次看到那个库的时候,感觉那是十分神奇的存在.不过估计现在那个库早就已经找不到了. 这是很早之前的一个DIV绘图类,那时候VML+SVG ...
- ubus
openwrt提供了一个系统总线ubus,类似linux桌面操作系统的d-bus,目标是提供系统级的进程间通信(IPC)功能. 为了提供各种后台进程和应用程序之间的通信机制,ubus被开发出来,由3部 ...
- 在同一台电脑上添加多个ssh key
1.创建新的ssh key: ssh-keygen -t rsa -C "your_email@email.com" 然后让你输入新的文件名称,这里设置为new # 设置名称为En ...
- 第一百五十八节,封装库--JavaScript,ajax说明
封装库--JavaScript,ajax说明 封装库ajax()方法,ajax通讯方法,跨页面向动态页面发送或获取数据 /** ajax()方法,ajax通讯方法,跨页面向动态页面发送或获取数据 * ...
- 【BZOJ】3203: [Sdoi2013]保护出题人(几何+三分+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=3203 wa无数次QAQ,犯sb错....一是数组没有引用...二是输出转成了int(越界了sad). ...
- npm安装express 公司上网设置代理
异常: 0 info it worked if it ends with ok1 verbose cli [ 'C:\\Program Files (x86)\\nodejs\\\\node.exe' ...