Python学习笔记——定制类

个人理解,如有错误请指正!共同学习,一起进步

学到定制类时,看到一段代码

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("ChenTian").c.d)

代码输出为 : /a/b/user/ChenTian/c/d

刚开始看不懂,后来明白了,记录一下

首先定义了Chain类,init函数接收一个path变量。

然后getattr函数,这个函数是如果你使用了类没有定义的变量的时候,就会调用它。它返回一个Chain(),并且把“原本的path/没有定义的变量”作为path的值传入了Chain里

call函数就是将类当作类似函数一样调用

str函数是当有打印函数是,就会调用这个

所以这段代码的执行流程为:

先是Chain()创建了一个实例,最开始的path默认为“”,然后.a,因为没有a这个变量,所以会调用getattr函数,返回一个Chain实例,然后把/a作为path传入,继续.b,因为没有b变量,所以执行getattr函数,将/a/b作为path传入,然后.user(“ChenTian”),先会执行getattr返回Chain实例,但是因为有()括号在,所以返回的是Chain(),这个就会调用call函数了,然后把“ChenTian”作为path传入,然后call函数就返回了/a/b/user/ChenTian,剩下的类同。

主要是user(“ChenTian”)这一句,我的理解是,先执行了getattr,然后执行call,并把ChenTian作为path传入

具体的细节我目前不是很清楚,我猜测是多了括号所以会调用call,不过不知道为什么。。。

你可能感兴趣的:(我的学习笔记)