1. getattr、setattr、hasattr

  getattr比较常用,与setattr和hasattr一起出现,他们也是最容易理解的,下面是他的用法:

class Profile():
name="xiaoxin"
def sex(self):
return "male"p=Profile()
hasattr(p, "name") # 判断属性是否存在
>>> True
hasattr(p, "age") # 判断属性是否存在
>>> False
getattr(p, "name") # 获取属性值
>>> xiaoxin
getattr(p, "sex")
>>> <bound method Profile.sex of <__main__.Profile object at 0x7f22608f9710>>
getattr(p, "age", 14) # 如果属性不存在,则返回默认值
>>> 14
setattr(p, "age", "") # 为属性赋值,并没有返回值
hasattr(p, "age") # 属性存在了
>>> True

2. __get__ 、 __set__、 __delete__

  提起__get__, 就不能不说  __set__, __delete__ , 一个类,只要其内部定义了方法 __get__, __set__, __delete__ 中的一个或多个,就可以称其为描述符。如果同时定义了__get__()__set__(),其被认为是一个数据描述符。只定义__get__()的描述符被称为非数据描述符。

  描述符常被用来作类型检查, 下面看它的具体用法:

class Integer:
def __init__(self, name):
self.name = name def __get__(self, instance, owner):
     if instance is None:
return self
else:
return instance.__dict__[self.name] def __set__(self, instance, value):
     if not isinstance(value, int):
raise TypeError('excepted an int')
instance.__dict__[self.name] = value def __delete__(self, instance):
     del instance.__dict__[self.name] class Point:
x = Integer('x')
y = Integer('y') def __init__(self, x, y):
self.x = x
self.y = y p = Point(2, 3)
p.x
>> 2
p.y
>> 3
p = Point(2.5, 3)
>> TypeError: excepted an int

  需要注意的是,对象属性的访问顺序:实例属性>类属性>父类属性>__getattr__(),当Python解释器发现实例对象的字典中,有与描述符同名的属性时,描述符优先,会覆盖掉实例属性。

3. __getattr__ 、__setattr__ 、__delattr__

  从对象中读取某个属性时,首先需要从self.__dicts__中搜索该属性,如果__dict__中没有该属性, 再从__getattr__中拿到返回值。当设置属性时,则会触发__setattr__方法,在这里可以进行类型验证(描述符只会对定义的描述符属性进行类型验证, 而__setattr__会对所有属性进行类型验证)

class Point:

    def __init__(self, x, y):
self.x = x
self.y = y def __getattr__(self, item):
print(f'getattr {item}')
return None def __setattr__(self, key, value):
print(f'setattr {key}:{value}')
if isinstance(value, int):
return object.__setattr__(self, key, value) def __delattr__(self, item):
print(f"delattr {item}")
del self.__dict__[item]
p = Point(2, 3)

>>> setattr x:2
>>> setattr y:3

p.x

>>> 3

p.c

>>> getattr c

>>> None

p.c = 9

>>> setattr c:9

p.c

>>> 9

4. __getattribute__

  无论调用属性还是方法,都是先强制调用 __getattribute__ 方法,然后再传回属性的值或者是 函数(方法)的引用。

class Point:

    def __init__(self, x, y):
self.x = x
self.y = y def __getattribute__(self, item): # 在 __getattribute__ 方法里面不要在出现self.**这种调用,因为每次调用类的属性都会强制调用 __getattribute__ ,会造成递归调用
return 'i get you ' if item == 'x' else object.__getattribute__(self, item) def __getattr__(self, item):
print(f'getattr {item}')
return None
p = Point(2, 3)
p.x
>>> i get you
p.y
>>> 3
p.c # 首先调用 __getattribute__ , 里面实现了 查找__dict__里面有没有这个键,如果没有再调用 __getattr__方法
>>> getattr c
>>> None

5. __getitem__、__setitem__、__delitem__

这三个方法主要用于对集合的操作

可变集合需要实现: __len__  __getitem__    __setitem__  __delitem__
不可变集合需要实现: __len__  __getitem__
__len__:返回集合长度
__getitem__(self, item) 使用索引访问元素
__setitem__(self, key, value) 对索引赋值,使用 self[key] = value 。
__delitem__(self, key) 删除索引值 del self[key]
__contains__ 实现in运算符,如果没有实现这个方法python也会调用__getitem__来使in运算符可用

class TemTest:

    def __init__(self,):
self.x = [i for i in range(10)] def __len__(self):
return len(self.x) def __getitem__(self, item):return self.x[item] def __setitem__(self, key, value):
self.x[key] = value def __delitem__(self, key):
del self.x[key] def __contains__(self, item):
return item in self.x def __repr__(self):
return '{}'.format(self.x)
test=TemTest() #实例化
print(len(test)) #返回长度
print(test[0]) #打印下标0的值
print(test[:3]) #切片
test[3]=10 #将下标3的值替换为10
print(test)
del test[3] #删除下标3的值
print(test)
print(1 in test) #测试in运算符
print(3 in test)
10
0
[0, 1, 2]
[0, 1, 2, 10, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 4, 5, 6, 7, 8, 9]
True
False

参考博文:https://www.cnblogs.com/flashBoxer/p/9645939.html

python学习之 getattr vs __get__ vs __getattr __ vs __getattribute__ vs __getitem__的更多相关文章

  1. 小甲鱼Python学习笔记

    一 isdigit()True: Unicode数字,byte数字(单字节),全角数字(双字节),罗马数字False: 汉字数字Error: 无 isdecimal()True: Unicode数字, ...

  2. python的反射函数(hasattr()、getattr()、setattr()与delattr())和类的内置属性attr(__getattr()__、__setattr()__与__delattr()__)

    主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省),有四个可以实现自省函数. hasattr(object,name) 判断object中是否有name字符串对应的属性或方法,返回Tr ...

  3. Python学习笔记之类与对象

    这篇文章介绍有关 Python 类中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中类的使用技巧 1.与类和对象相关的内置方法 issubclass(class, classinfo) ...

  4. Python学习笔记之常用函数及说明

    Python学习笔记之常用函数及说明 俗话说"好记性不如烂笔头",老祖宗们几千年总结出来的东西还是有些道理的,所以,常用的东西也要记下来,不记不知道,一记吓一跳,乖乖,函数咋这么多 ...

  5. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  6. 记录Python学习中的几个小问题

    记录Python学习中的几个小问题,和C#\JAVA的习惯都不太一样. 1.Django模板中比较两个值是否相等 错误的做法 <option value="{{group.id}}&q ...

  7. 《Python学习手册》读书笔记

    之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我 ...

  8. Python:Python学习总结

    Python:Python学习总结 背景 PHP的$和->让人输入的手疼(PHP确实非常简洁和强大,适合WEB编程),Ruby的#.@.@@也好不到哪里(OO人员最该学习的一门语言). Pyth ...

  9. Python学习的个人笔记(基础语法)

    Python学习的个人笔记 题外话: 我是一个大二的计算机系的学生,这份python学习个人笔记是趁寒假这一周在慕课网,w3cschool,还有借鉴了一些博客,资料整理出来的,用于自己方便的时候查阅, ...

随机推荐

  1. #033 信安培训基础题Python解决网络安全实验室|网络信息安全攻防学习平台

    第三题猜猜这是经过了多少次加密?分值: 200 加密后的字符串为:一大串 字符串最后面是= 所以是base64.b64decode编码究竟为啥有=就是base64咱也不知道 咱也不敢问咋解密也是从网上 ...

  2. ubuntu18.04从零开始配置环境(jdk+tomcat+idea)到使用idea开发web应用和servlet

    昨天吃了亏,搞了一下午才把环境配置好,故此将整个过程记录一下以防日后需要. 注意:因为我的博客模块的原因,所以我把图片压缩了一些,如果有看不清的, 可以  右键图片->在新标签页打开图片 目录: ...

  3. CMake与Make最简单直接的区别 [转]

    写程序大体步骤为: 1.用编辑器编写源代码,如.c文件. 2.用编译器编译代码生成目标文件,如.o. 3.用链接器连接目标代码生成可执行文件,如.exe. 但如果源文件太多,一个一个编译时就会特别麻烦 ...

  4. 逆卷积的详细解释ConvTranspose2d(fractionally-strided convolutions)

    1.首先先定义进行卷积的参数: 输入特征图为高宽一样的Hin*Hin大小的x 卷积核大小kernel_size 步长stride padding填充数(填充0) 输出特征图为Hout*Hout大小的y ...

  5. python读写excel文件

    '''xlrd和xlwt处理的是xls文件,单个sheet最大行数是65535,如果有更大需要的,建议使用openpyxl函数,最大行数达到1048576.'''import openpyxl ''' ...

  6. HTML之表单

    目录 表单的结构 get方式与post方式 输入 单行文本输入框 提交按钮和重置按钮 密码输入框 复选框 单选按钮 图像按钮 文本选择输入框 隐藏框 多行文本输入框 下拉列表框 新增输入元素 新增其他 ...

  7. 菜鸟学python之程序初体验

    作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2684 1.字符串操作: 解析身份证号:生日.性别.出生地等. def id ...

  8. Infiniband 网络性能测试

    1.带宽测试   在server端执行 [ibtests]# ib_send_bw -a -c UD -d mlx4_0 -i 1 ---------------------------------- ...

  9. 《Python从入门基础到实践》

    <Python学习——从入门到实践> 第1章 Python语言概述 1.1 从计算机到编程 1.1.1 程序语言的演变:机器语言,汇编语言,高级语言 1.1.1.1 演变原因 1.1.1. ...

  10. JS学习笔记:(二)回流和重绘

    在搞清楚回流和重绘的概念之前,我们要清除浏览器的渲染过程. 解析生成DOM Tree(此时包含所有节点,包括display:none); 根据CSS Object Module(CCSSOM)计算节点 ...