一、内置attr:__setattr__,__delattr__,__getattr__

  1. __setattr__ #添加/修改属性会触发它的执行
  2. __delattr__ #删除属性的时候会触发
  3. __getattr__ #只有在调用属性且属性不存在的时候才会触发
  1. class Foo:
  2. def __init__(self,x):
  3. self.name=x
  4.  
  5. def __setattr__(self, key, value):
  6. # if not isinstance(value,str):
  7. # raise TypeError('must be str')
  8. # print('----setattr---key:%s,value:%s' %(key,value))
  9. # print(type(key))
  10. # print(type(value))
  11. # self.key=value
  12. # setattr(self,key_str,value) #self.key_attribute=value #这是无限递归
  13. self.__dict__[key]=value #因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值
  14.  
  15. def __delattr__(self, item):
  16. print('delattr:%s' %item)
  17. print(type(item))
  18. # delattr(self,item) #这是无限递归
  19. # del self.item
  20. self.__dict__.pop(item) #我们可以直接修改属性字典,来完成添加/修改属性的操作
  21.  
  22. f1=Foo('egon') #f1.name='egon'
  23.  
  24. f1.age=18
  25.  
  26. print(f1.__dict__)
  27. print(f1.name)
  28. print(f1.age)
  29.  
  30. print(f1.__dict__)
  31. del f1.age
  32. print(f1.__dict__)
  33. print(f1.age)
  34.  
  35. #---------------------getattr------------------------
  36.  
  37. class Foo:
  38. def __init__(self,x):
  39. self.name=x
  40.  
  41. #属性不存在的情况下才会触发
  42. def __getattr__(self, item):
  43. print('getattr-->%s %s' %(item,type(item)))
  44.  
  45. f=Foo('egon')
  46. # print(f.name)
  47.  
  48. print(f.xxxxxxx)

三板斧绝技

二、二次加工标准类型(包装)

包装:python默认提供了标准数据类型,以及丰富的内置方法,有时候需要基于标准数据类型来定制我们自己的数据类型,新增或改写方法,这就用到了继承和派生知识(标准类型均可以通过以下方式进行二次加工)

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

实现授权的关键点就是覆盖__getattr__方法

定制自己的数据类型:

  1. 继承的方式
  2. 授权的方式
  1. l=list([1,2,3])
  2.  
  3. l.append(4)
  4. l.append('')
  5. print(l)
  6.  
  7. class List(list):
  8. pass
  9.  
  10. l1=List([1,2,3])
  11. print(l1)
  12. l1.append(4)
  13. print(l1)
  14. l1.append('')
  15. print(l1)

小例子

  1. #基于继承的原理,来定制自己的数据类型(继承标准类型)
  2. class List(list):
  3. def append(self, p_object):
  4. # print('--->',p_object)
  5. if not isinstance(p_object,int):
  6. raise TypeError('must be int')
  7. # self.append(p_object)
  8. super().append(p_object)
  9. def insert(self, index, p_object):
  10. if not isinstance(p_object,int):
  11. raise TypeError('must be int')
  12. # self.append(p_object)
  13. super().insert(index,p_object)
  14. #
  15. l=List([1,2,3])
  16. # print(l)
  17. # l.append(4)
  18. # print(l)
  19.  
  20. # l.append('5')
  21. print(l)
  22. # l.insert(0,-1)
  23. l.insert(0,'-1123123213')
  24. print(l)
  25.  
  26. # def test(x:int,y:int)->int:
  27. # return x+y
  28. # print(test.__annotations__)
  29. #
  30. # print(test(1,2))
  31. # print(test(1,'3'))
  32. #
  33. # def test(x,y):
  34. # return x+y

基于继承的原理,来定制自己的数据类型(继承标准类型)

  1. #不能用继承,来实现open函数的功能
  2. # f=open('a.txt','w')
  3. # print(f)
  4. # f.write('1111111')
  5.  
  6. #授权的方式实现定制自己的数据类型
  7. import time
  8.  
  9. class Open:
  10. def __init__(self,filepath,m='r',encode='utf-8'):
  11. self.x=open(filepath,mode=m,encoding=encode)
  12.  
  13. self.filepath=filepath
  14. self.mode=m
  15. self.encoding=encode
  16.  
  17. def write(self,line):
  18. print('f自己的write',line)
  19. t=time.strftime('%Y-%m-%d %X')
  20. self.x.write('%s %s' %(t,line))
  21.  
  22. def __getattr__(self, item):
  23. # print('=------>',item,type(item))
  24. return getattr(self.x,item)
  25. #
  26. # f=Open('b.txt','w')
  27. # # print(f)
  28. # f.write('111111\n')
  29. # f.write('111111\n')
  30. # f.write('111111\n')
  31.  
  32. f=Open('b.txt','r+')
  33. # print(f.write)
  34. print(f.read)
  35.  
  36. res=f.read() #self.x.read()
  37. print(res)
  38.  
  39. print('=-=====>',f.read())
  40. f.seek(0)
  41. print(f.read())
  42. # f.flush()
  43. # f.close()

授权的方式实现定制自己的数据类型

  1.  

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. Request介绍及演示样例 PART1

    Request在ServletAPI的规范连接地址http://blog.csdn.net/zghwaicsdn/article/details/51035146 HTTP简介 URL是浏览器寻找信息 ...

  2. ios的设计原则

    ios的设计原则 iOS设计的详细的主要宗旨例如以下: 1.易操作,所关心的主题清新 2.UI控件布局合理,图片质量清新 3.用户的使用习惯 4.字体的大小,主次分明 5.舒适的动画效果 在创建一个新 ...

  3. html-文本处理

    文本处理-相关操作: <!-- 申明为html5版本 --> <!DOCTYPE html> <html> <head> <title>文本 ...

  4. PHP案例:学生信息管理系统

    -- Database: test -- 表的结构 message CREATE TABLE `message` ( `id` tinyint(1) NOT NULL PRIMARY KEY AUTO ...

  5. angular 输入属性@Input , 输出属性@Output , 中间人模式

    1 输入属性 通常用于父组件向子组件传递信息 举个栗子:我们在父组件向子组件传递股票代码,这里的子组件我们叫它app-order 首先在app.order.component.ts中声明需要由父组件传 ...

  6. windows下搭建ffmpeg+nginx+rtmp-module搭建实时视频环境

    下载ffmpeg的Windows静态版: https://ffmpeg.zeranoe.com/builds/win64/static/下载nginx-rtmp-windows版:https://gi ...

  7. java语言中public、private、protected三个关键字的用法,重写和重载的区别。

    java语言中public.private.protected三个关键字的用法,重写和重载的区别. 解答: 作用域 当前类 同包 子类 其它 public √ √ √ √ protected √ √ ...

  8. 【微信小游戏】文件系统,远程加载资源打破4M限制

    一.前提 微信小游戏,对游戏包体的大小有严格是限制,上传文件大小<4M,但是本地缓存文件有50M空间,也就是说我们可以将一些资源放到网上,然后缓存到本地. 二.官方概念 文件系统 文件系统是小程 ...

  9. Docker for window 无法共享磁盘

    Docker for window 无法共享主机磁盘,环境如下: 操作系统: windown10 Docker version 18.09.0, build 4d60db4 症状如下: 如图,点击ap ...

  10. Machine Learning Yearning - Andrew NG

    链接(1~12章): https://gallery.mailchimp.com/dc3a7ef4d750c0abfc19202a3/files/Machine_Learning_Yearning_V ...