一、内置attr:__setattr__,__delattr__,__getattr__

  1. __setattr__ #添加/修改属性会触发它的执行
  2. __delattr__ #删除属性的时候会触发
  3. __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__方法

定制自己的数据类型:

  1. 继承的方式
  2. 授权的方式
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__和 二次加工标准类型(包装)的更多相关文章

  1. python基础----isinstance(obj,cls)和issubclass(sub,super)、反射、__setattr__,__delattr__,__getattr__、二次加工标准类型(包装)

    一.isinstance(obj,cls)和issubclass(sub,super)                                isinstance(obj,cls)检查是否ob ...

  2. python 基础篇 15 内置函数和匿名函数

    ------------------------>>>>>>>>>>>>>>>内置函数<<< ...

  3. python基础之常用内置函数

    前言 python有许多内置的函数,它们定义在python的builtins模块,在python的代码中可以直接使用它们. 常用的内置函数 类型转换 int python的整数类型都是int类型的实例 ...

  4. python基础学习笔记——内置函数

    一. 简介 python内置了一系列的常用函数,以便于我们使用,python英文官方文档详细说明:点击查看, 为了方便查看,将内置函数的总结记录下来. 二. 使用说明 以下是Python3版本所有的内 ...

  5. python基础 (装饰器,内置函数)

    https://docs.python.org/zh-cn/3.7/library/functions.html 1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使 ...

  6. python基础之反射内置方法元类

    补充内置函数 isinstance(obj,Foo)   # 判断obj是不是foo的实例 issubclass()      # 判断一个类是不是另一个类的子类 反射 什么是反射? 通过字符串来操作 ...

  7. Python基础学习五 内置函数

    1.函数补充: 1)函数返回值return可以有多个 2)补充示例: nums = [0,1,2,3,4,5,6,7,8] #如何将list里面的元素变为字符串类型 new_nums = [str(x ...

  8. Python 基础之常用内置函数

    1.常用内置函数 (1)abs 绝对值函数 intvar = -9 res = abs(intvar)print(res) (2)round 四舍五入 (n.5 n为偶数则舍去 n.5 n为奇数 ,则 ...

  9. python基础学习Day14 内置函数 匿名函数

    一.内置函数里几个高频重要函数 (1)min\max函数的用法 以min函数的为例: min:返回可迭代对象的最小值(可加key,key为函数名,通过函数的规则,返回最小值). l1 =[(,),(, ...

随机推荐

  1. Vivado的helloword程序:软件工程部分

    建立工程 Export结束后,会自动启动SDK.界面如下.可以看到工程浏览器Project Explorer中已经有一个硬件平台hw_platform_0,里面有一系列配置和初始化文件.不要修改这些文 ...

  2. 【问题记录】shiro logout UnknownSessionException

    问题描述:web项目中使用shiro做登录权限控制,当shiro执行logout后,直接返回一个jsp路径会抛出org.apache.shiro.session.UnknownSessionExcep ...

  3. Jquery学习笔记(2)--五角星评分

    网购五星评分模拟: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  4. VirtualBox错误ID: PAEmode解决

    今天在导入virtualbox的虚拟机ubuntu系统时,报错,无法打开虚拟机 报错内容如下: 错误 ID: PAEmode 严重: 致命错误 The guest is trying to switc ...

  5. JavaScript绘图类 (DIV绘图)

    主要的图形算法抄自一个叫w_jsGraphics.js的类库,第一次看到那个库的时候,感觉那是十分神奇的存在.不过估计现在那个库早就已经找不到了. 这是很早之前的一个DIV绘图类,那时候VML+SVG ...

  6. ubus

    openwrt提供了一个系统总线ubus,类似linux桌面操作系统的d-bus,目标是提供系统级的进程间通信(IPC)功能. 为了提供各种后台进程和应用程序之间的通信机制,ubus被开发出来,由3部 ...

  7. 在同一台电脑上添加多个ssh key

    1.创建新的ssh key: ssh-keygen -t rsa -C "your_email@email.com" 然后让你输入新的文件名称,这里设置为new # 设置名称为En ...

  8. 第一百五十八节,封装库--JavaScript,ajax说明

    封装库--JavaScript,ajax说明 封装库ajax()方法,ajax通讯方法,跨页面向动态页面发送或获取数据 /** ajax()方法,ajax通讯方法,跨页面向动态页面发送或获取数据 * ...

  9. 【BZOJ】3203: [Sdoi2013]保护出题人(几何+三分+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3203 wa无数次QAQ,犯sb错....一是数组没有引用...二是输出转成了int(越界了sad). ...

  10. npm安装express 公司上网设置代理

    异常: 0 info it worked if it ends with ok1 verbose cli [ 'C:\\Program Files (x86)\\nodejs\\\\node.exe' ...