python 中 方法def total(*numbers, **keywords): 参数列表中1个*和2个*分别代表啥意识
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 中 方法def total(*numbers, **keywords): 参数列表中1个*和2个*分别代表啥意识相关的知识,希望对你有一定的参考价值。
用在函数定义里,numbers捕获了所有的位置参数(非keyword参数),keywords捕获了所有的keywords参数。例子:
>>> def f(*args, **kwargs):
. . . print type(args), args
. . . print type(kwargs), kwargs
. . .
>>> f(1,2, a=3)
<type 'tuple'> (1, 2)
<type 'dict'> 'a': 3
而如果是用在函数调用里,如
s = total(*numbers, **keywords)
则numbers会依次展开作为total的位置参数,而keywords则会按key=value展开作为total的keyword参数。
例如,上面例子里的f(1,2, a=3)也可以这样写:
f(*[1,2], **'a', 3)
会输出同样的结果 参考技术A 函数参数里一个星号表示元组,两个星号表示字典
你给的这个函数定义就相当于声明了第一个参数是元组类型的,第二个参数是字典类型的
python里面星号的用途除了用作四则运算里面的乘号,只有这个用途了 参考技术B n = [1,'aaa']
d = 'a':123,'b':'bbb'
total(n,d)
相当于:
total(1, 'aaa', a=123,b=bbb)
即分别将 list 和 dict 拆成单个元素
如何在python中引用父方法? [复制]
【中文标题】如何在python中引用父方法? [复制]【英文标题】:how to refer to a parent method in python? [duplicate] 【发布时间】:2012-03-09 23:36:18 【问题描述】:假设我有两个类(一个是父类,一个是子类)。如果子类中也定义了不同的方法,如何引用父类中的方法?
代码如下:
class A:
def __init__(self, num):
self.value=num
def f(self, num):
return self.value+2
class B(A):
def f(self, num):
return 7*self.f(num)
在最后一行,我想使用“self.f(num)”命令来引用父类 A,而不是 B 中会创建无限递归的方法本身。提前谢谢你。
【问题讨论】:
【参考方案1】:如果您知道要使用 A,您也可以通过这种方式显式引用 A:
class B(A):
def f(self,num):
return 7 * A.f(self,num)
请记住,您必须将 self 参数显式地提供给成员函数 A.f()
【讨论】:
当我尝试调用一个在 C 中实现的方法时,我在执行此操作时出错。它期望 A 的实例作为第一个参数并且没有将 B 识别为子类。我想使用 super() 可能会解决这个问题,但我还不确定。【参考方案2】:使用super
:
return 7 * super(B, self).f(num)
或者在 python 3 中,它只是:
return 7 * super().f(num)
【讨论】:
这在理论上是正确的,但由于某种原因,我得到:TypeError: super() argument 1 must be type, not classobj @user1111042:让我猜猜——你使用的是 Python 2.x?那么你的 class A 应该继承自 object,然后你才会得到一个新的样式类。新样式类是类 type 的实例,而旧样式类只是 classobj 的实例。 super() 仅适用于新样式类。 是的,我正在使用 Python 2.x 和你所说的 super 在 2.x 中不起作用 哦,对了。老式的课程,我忘了。您确实应该将 A 定义为class A(object)
,之后这将起作用。【参考方案3】:
与其他答案一致,有多种方法可以调用超类方法(包括构造函数),但是在 Python-3.x 中,该过程已被简化:
Python-2.x
class A(object):
def __init__(self):
print "world"
class B(A):
def __init__(self):
print "hello"
super(B, self).__init__()
Python-3.x
class A(object):
def __init__(self):
print "world"
class B(A):
def __init__(self):
print "hello"
super().__init__()
super()
现在等同于super(<containing classname>, self)
,根据the docs。
【讨论】:
【参考方案4】:为什么不保持简单?
class B(A):
def f(self, num):
return 7 * A.f(self, num)
【讨论】:
【参考方案5】:class B(A):
def f(self, num):
return 7 * super(B, self).f(num)
【讨论】:
【参考方案6】:你可以使用 super 或者如果你可以更明确地做这样的事情。
class B(A):
def f(self, num):
return 7 * A.f(self, num)
【讨论】:
【参考方案7】:在Call a parent class's method from child class in Python?查看我的回答。
这里的其他一些(不使用 super)略有不同。
【讨论】:
以上是关于python 中 方法def total(*numbers, **keywords): 参数列表中1个*和2个*分别代表啥意识的主要内容,如果未能解决你的问题,请参考以下文章