python3,定制类,getattr相关用法
问题描述
class Chain(object): def __init__(self,path=''):self._path = path def __getattr__(self,path):return Chain('%s/%s' %(self._path,path)) def __call__(self,path):return Chain('%s/%s' %(self._path,path)) def __str__(self):return self._path __repr__ = __str__ print(Chain().a.b.user('Michael').c.d)
看了好久还是理解不了这语句,如能详述一些细节,感激不尽
问题解答
回答1:getattr(object, name[, default])
class Student(object): def __init__(self):self.name = ’Michael’ def __getattr__(self,attr):return attrs = Student()s.name --> ’Michael’s.score--> ’score’
_getattr__是python里的一个内建函数,动态返回一个属性当调用不存在的属性时,Python会试图调用__getattr__(self,’score’)来获取属性,并且返回score
__str__用于打印函数__call__把类当做类似函数一样调用
代码执行流程: Chain()创建一个实例,并且 path初始默认为 '' ,Chain().a 时,类中并没有 a 属性,Python解析器调用 getattr函数 --> __getattr__(self,path=’a’),并返回一个Chain实例,然后把/a 赋值gei path 传入,继续b,因为同样没有b 属性,执行getattr函数,将/a/b传入,然后.user(“Michael”),先会执行getattr返回Chain实例,但是因为有()括号在,所以返回的是Chain(),这个就会调用call函数了,然后把“ChenTian”作为path传入,然后call函数就返回了/a/b/user/ChenTian,剩下的类同。
.user('Michael”) 刚开始的user被getattr函数捕获,并返回Chain(),然后再执行__call__来调用 'Michael'
代码流程图
相关文章:
1. python3中用format怎么把变量(浮点数)转成整数打印出来2. 新手求教python3如何把dict循环写入csv文件(在进行爬虫时遇到的问题)?3. python3.5 urllib.parse.unquote 乱码4. python3.x - python中有没有直接对多维数组排序的方法?5. Python3.6 int优化机制的问题,64位机器(-5至257)6. python3.x - python中使用pymysql插入数据时当数据是字母字符串时报错7. python3.x - 用批处理的start命令来运行指定Python脚本的时候,只要这个Python脚本的路径或名字带有中文就无法执行,请问怎么解决?8. python3.x - python中的虚拟环境怎样设置一直处于激活状态9. pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)10. python3.x - python 3.6 安装 opencv 3.2 import cv2 报错