python 3.x 定制类class,getattr怎么用?,pythongetattr,class Chain(
python 3.x 定制类class,getattr怎么用?,pythongetattr,class Chain(
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)
看了好久还是理解不了这语句,如能详述一些细节,感激不尽
getattr(object, name[, default])
class Student(object): def __init__(self): self.name = 'Michael' def __getattr__(self,attr): return attr s = 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"
代码流程图
编橙之家文章,
相关内容
- Python 2.X版本中闭包是怎么实现的?,python2.x,大家怎么用
- Python遍历U盘目录转义符问题求助,python转义,用Python遍
- celery python如何解决worker和client代码同步问题,celerywo
- Sublime Text调用python原理机制是如何?,sublimepython,假设
- 如何将js代码转化成python代码求方法,jspython,// 先加载
- Python存储多面体3D模型具体方法怎么做到,python多面体
- Flask可以将渲染后模板生成HTML文件吗?怎样写,flask模板
- Python下bytearray()函数应用环境是什么,pythonbytearray,Pyt
- 怎么样来更好的学习Python前后端通信连接知识?,pytho
- Flask操作结束后,要回到触发请求页面需要怎么设置,
评论关闭