1.args的介绍和基本使用方法
在定义方法的时候python提供了两种形式参量*args和**args,这两种形参给予了python在调用函数的时候具有极大的便利,在编程的时候可以更加灵活,我们拿pyqtgraph的plot方法为例
def plot(*args, **kargs):
"""
Create and return a :class:`PlotWindow <pyqtgraph.PlotWindow>`
(this is just a window with :class:`PlotWidget <pyqtgraph.PlotWidget>` inside), plot data in it.
Accepts a *title* argument to set the title of the window.
All other arguments are used to plot data. (see :func:`PlotItem.plot() <pyqtgraph.PlotItem.plot>`)
"""
mkQApp()
#if 'title' in kargs:
#w = PlotWindow(title=kargs['title'])
#del kargs['title']
#else:
#w = PlotWindow()
#if len(args)+len(kargs) > 0:
#w.plot(*args, **kargs)
pwArgList = ['title', 'labels', 'name', 'left', 'right', 'top', 'bottom', 'background']
pwArgs = {}
dataArgs = {}
for k in kargs:
if k in pwArgList:
pwArgs[k] = kargs[k]
else:
dataArgs[k] = kargs[k]
w = PlotWindow(**pwArgs)
w.sigClosed.connect(_plotWindowClosed)
if len(args) > 0 or len(dataArgs) > 0:
w.plot(*args, **dataArgs)
plots.append(w)
w.show()
return w
从上图中可以看到plot方法将形参kargs当做一个字典来使用,那么它的底层是怎么到底是什么的样的呢?
让我们先来测试*args
def method1(a,b,c,*args):
print("a=",a)
print("b=",b)
print("c=",c)
print("*agrs=",args)
调用该方法
method1(1,2,3,4,5)
'''
output
a= 1
b= 2
c= 3
*agrs= (4, 5)
'''
可以看到*args用于接收除了形参以外多余的参数,这意味着,如果函数里面有普通变量的形参,*args不可以放在这些普通变量的前面!!
def method1(*args,a,b,c):
print("a=",a)
print("b=",b)
print("c=",c)
print("*agrs=",args)
如果运行上述代码,就会报错
让我们再来看看**agrs的功能
def method2(a,b,**args2):
print("a=", a)
print("b=", b)
print("*agrs2=", args2)
method2(11, 22,name="jack")
'''
a= 11
b= 22
*agrs2= {'name': 'jack'}
'''
这说明**args形参储存的是字典,以字典的形式保存,这也就是为了文章开头的时候我们看到plot方法用了for in 遍历
让我们结合*args和**agrs使用
def method2(a,b,*args1,**args2):
print("a=", a)
print("b=", b)
print("*agrs1=", args1)
print("*agrs2=", args2)
method2(1, 2, 3, 4, 5,name="jack")
'''
a= 1
b= 2
*agrs1= (3, 4, 5)
*agrs2= {'name': 'jack'}
'''
注意:这里的*args和**agrs的顺序不可以颠倒,否则直接在coding阶段报错
需要注意的是:形参中的*args或者**args中args变量满足标识符命名规范,可以定义自己需要的变量名
2.args形参在构造方法中的运用
**args可以传递键值对,根据这个原理,我们可以运用args给一个类的构造方法传参,这样子就能往构造方法中任意传参数进去,再运用字典的get()方法来调用,更具灵活性
class person:
def __init__(self,**agrs):
print("调用了初始化方法")
self.name = agrs.get("name")
self.age =agrs.get("age")
self.printMessage()
def printMessage(self):
print(self.age)
print(self.name)
zhangsan =person(name="小明",age="18")
jack = person(name="jack")
版权声明:本文为linZinan_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。