Python定制类

本文探讨了Python中实现链式调用的原理,并通过示例展示了如何构造一个类来模拟REST API的路径构建。通过定义`__getattr__`和`__call__`方法,使得类实例在调用不存在的属性时,能够动态构建URL路径。此外,还介绍了如何将参数插入URL中,以方便调用如GitHub API等需要动态参数的REST接口。
摘要由CSDN通过智能技术生成

值得一提的是这个用法:效果

>>> Chain().status.user.timeline.list
'/status/user/timeline/list'

上代码:

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

	
>>> Chain().status.user.timeline.list
/status/user/timeline/list

这里有几个问题:

1.逻辑比较明显。每次调用并不存在的方法时,返回return Chain("%s/%s"%(self._path,path))这种字符串,不管多少次调用最后都会变成chain(“XX/XX/XX”)

2.chain(“XX/XX/XX”)变成字符串需要改写__str__方法,不然传回的是地址。

3.记得__repr__=__str__使开发者也能看到效果

留一个问题:

作业上的:

还有些REST API会把参数放到URL中,比如GitHub的API:

GET /users/:user/repos

调用时,需要把:user替换为实际用户名。如果我们能写出这样的链式调用:

Chain().users('michael').repos

就可以非常方便地调用API了。有兴趣的童鞋可以试试写出来。

>>> class Chain(object):
	def __init__(self,path=""):
		self._path=path
	def __getattr__(self,path):
		if ????:
			return Chain(????)
		else:
			return Chain("%s/%s"%(self._path,path))
	def __str__(self):
		return self._path
	__repr__=__str__

是这么写吗?那??应该写什么呢?

直到我看到了:

__call__

一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用instance.method()来调用。能不能直接在实例本身上调用呢?在Python中,答案是肯定的。

任何类,只需要定义一个__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() # self参数不要传入
My name is Michael.

豁然开朗:

>>> class Chain(object):
	def __init__(self,path=""):
		self._path=path
	def __getattr__(self,path):
        if path=="user":
            return self
		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__

	
>>> Chain().users('michael').repos
/users/michael/repos

 我还真他娘是个天才

步骤基本可能是这样Chain().users先让解释器去找users属性,结果返回的是Chain()即self,然后变成了Chain()(“michael”),于是去调用__call__

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值