测试环境:
Windows 10
python 3.7.2
工具: Pycharm
链式调用
在学习某一个新的模块时,看到了链式调用这一操作,查找了一下资料,还真是像钟馗的钩一样,一条锁链钩五杀(开玩笑呢,不过真有这种大佬吗?)。
言归正传,链式,本质上回传的是一个对象化实例,这有点像装饰器啊!装饰器回传的是函数对象,但其实都一样的,函数是对象,类对象也是对象,没差。
所谓链式调用就是调用完一个函数后还能再继续调用其它函数,这样大大减少了代码量,尤其是项目比较大的时候,
普通调用就是对象名.函数1 … 对象名.函数2
正常调用函数,也就是单独调用函数,代码演示如下:
chain = Master()
chain.slaver1("001")
chain.slaver2("002")
.
.
.
chain.xxx("xxx")
链式调用代码演示如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:沐修
# content:链式调用
class Master:
def __init__(self):
self.name = ""
def slaver1(self,name):
self.name = name
print("名字是 %s" % name)
return self
def slaver2(self,name):
self.name = name
print("名字是 %s" % name)
return self
def slaver3(self,name):
self.name = name
print("名字是 %s" % name)
return self
Master().slaver1("001").slaver2("002").slaver3("003")
运行结果:
我们在定义类方法的时候,总会写的的第一个参数self
了。几乎每个类方法里面都会有它。大家只知道在类里面调用类方法的时候可以用self.xxx()
,在调用类属性的时候可以用self.yy
,那么有没有思考过,这个东西如果单独使用会怎么样呢?
实际上,self
指的就是这个类实例化成一个对象以后,这个对象自身。而这个对象显然是有包含了类拥有的方法。返回来的自然还是原来的对象 Master()
缓存链式调用的参数
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:沐修
# content:缓存链式调用的关键字参数
class Master:
def __init__(self):
self.cache_condition = {}
def slaver1(self, **kwargs):
self.cache_condition.update(kwargs)
return self
def slaver2(self, **kwargs):
self.cache_condition.update(kwargs)
return self
def slaver3(self, **kwargs):
self.cache_condition.update(kwargs)
return self
cache = Master().slaver1(slaver1="001").slaver2(slaver2="002").slaver3(slaver3="003")
print(cache.cache_condition)
print(cache)
运行结果:
Black 格式化工具与链式调用的发现
应该是我孤陋寡闻了,现在才知道链式调用,还能这么调用,直接看代码,不废话。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:沐修
# content:Black格式化后的链式调用
class Master:
def __init__(self):
self.cache_condition = {}
def slaver1(self, **kwargs):
self.cache_condition.update(kwargs)
return self
def slaver2(self, **kwargs):
self.cache_condition.update(kwargs)
return self
def slaver3(self, **kwargs):
self.cache_condition.update(kwargs)
return self
cache =( Master()
.slaver1(slaver1="001")
.slaver2(slaver2="002")
.slaver3(slaver3="003")
)
print(cache.cache_condition)
print(cache)
运行结果:
看懂不,被圆括号( ) 围起来,并没有发生变化,只是提高优先级罢了,先运行哪个代码,这样的含义,但是下面的链式调用,在不同行下,可以任意更换空格的。
注意,第一行末尾的反斜杠根本不需要,因为(…)圆括号已经构成了一个逻辑行
print("test1 "
,"test2")
在这里已经完全不需要反斜杠\
,来转义,等同于这一块代码都是一个整体,不会被分割。
所以圆括号的有趣之处,还是要记一下,方便以后能看懂,不要到时看懵了。
还有这里只是看到用Black格式化工具格式化后代码,所产生的问题,并详细介绍Black格式化工具,具体看链接,后续我可能会去尝试。
参考链接: