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(&lt;containing classname&gt;, 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个*分别代表啥意识的主要内容,如果未能解决你的问题,请参考以下文章

Python进度条小实例

为啥我在 Python 中没有得到 333

Python 进度条

python杂谈:Python中 的用法示例

Django——自定义分页(可调用)

python 定义class时的内置方法