python---对于动态返回属性__getattr__和实例直接调用__call__的理解

 对于__getattr__的理解

class Chain(object):
    def __init__(self,path=''):
        self._path = path
    def __getattr__(self,path):
        print self._path,path
        return Chain('%s/%s'%(self._path,path))
    def __str__(self):
        return self._path

print Chain().status.user.timeline.list

执行结果为:

 status
/status user
/status/user timeline
/status/user/timeline list
/status/user/timeline/list

由结果可知:

首先执行Chain(),开始为空,随后__getattr__动态增加了一个status属性,Chain().status代表获取了属性,所以第一行结果为:空和status,获取status属性后,__getattr__函数返回值返回Chain('/status'),self._path变为/status,后面的依次执行,最后生成/status/user/timeline/list。

对于__call__的理解

一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用instance.method()来调用。能不能直接在实例本身上调用呢?任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用。

class Student(object):
    def __init__(self, name):
        self.name = name

    def __call__(self):
        print('My name is %s.' % self.name)

>>> s = Student('Michael')
>>> s()
My name is Michael.

开始理解下面示例

__call__函数有个s参数,也就是对实例进行调用时可以带参数。

# -*- coding:utf-8 -*-
class Chain(object):
    def __init__(self,path=''):
        self._path = path
    def __getattr__(self,path):
        print self._path,path
        return Chain('%s/%s'%(self._path,path))
    def __str__(self):
        return self._path
    def __call__(self, s):
        return Chain('%s:%s'%(self._path,s))

print Chain().status.user('micheal').timeline.list

执行结果为:

 status
/status user
/status/user:micheal timeline
/status/user:micheal/timeline list
/status/user:micheal/timeline/list

直接说 /status/user:micheal,把('micheal')前面看成一个整体,例如Chain().status.user,相当于一个实例,然后通过__call__对实例进行调用,因为有括号里面有参数,所以定义__call__函数时,增加了s参数。

到此。仅个人理解,如有错误欢迎指正,本人刚开始学习python,望见谅。

笔芯~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值