Python:“TypeError:uinit_uu()完全接受“x”参数(“y”给定);x>0<y

2024-09-28 01:23:48 发布

您现在位置:Python中文网/ 问答频道 /正文

当我假设一种语言的概念,特别是C++ +爪哇/其他的参数“函数重载”(1),在这种情况下,在另一个Python中工作时,类型错误就发生在我身上。一般来说,Python的评估需要一些详细的建议,但我认为这需要一些人的建议。在

实验

代码1:

class Toolbox:    
  trayA = ()    
  trayB = ()    

  def __init__(self):
        self.trayA = ("nail", "screw")        
        self.trayB = ("hammer", "nail", "long nail")

  def __init__(self,tA,tB):
        self.trayA = tA
        self.trayB = tB

#Instance defs
tb = Toolbox()
#tb = Toolbox(("n1","n2","n5"),("screwdriver","long screw"))

#Test
print(tb.trayA)
print(tb.trayB)

结果:
“类型错误:init()只接受3个参数(给定1个)” 分析:
*预期的参数数3与定义的2的第二个init定义匹配。
*使用第二个定义2。在

代码2:
说明:
从代码1中,删除了对3-param调用的注释。
注释掉了1-param调用。
结果:
通过(即无错误)

代码3:
说明:
从代码1开始,初始定义的交换顺序。
结果:
通过

代码4:
说明:
从代码3中,注释掉了1-param调用,并取消了3-param调用的注释
结果:
Fail“TypeError:init()只接受1个参数(给定3个)”

结论:


重载函数/方法序列中最后定义的函数/方法是程序员定义/调用这些函数/方法的实例时Python引用的唯一定义。

确认

我认为,当听众是技术性的,作者有足够的知识,有足够的时间考虑细节的条件(如果在一个概念上不够强大,不能立即使用这个术语),那么就必须具体化。感谢Paul Rooney帮助我更具体地说,用“函数重载”[1]代替了“多态性”[2,3],尤其是在我使用了“特别”这个词之后。在

参考文献

[1]:“函数重载”。维基百科。https://en.wikipedia.org/wiki/Function_overloading。访问日期:2017年9月20日。
[2] :Cohoon和Davidson。C++程序设计。第3版,2002年。
[3] :“多态性(计算机科学)”。维基百科。en.wikipedia.org/wiki/polymorphic_(计算机科学)。访问日期:2017年9月20日。


Tags: 方法函数代码self概念参数定义param
2条回答

如果有多个函数具有相同的名称,python将使用最后一个函数。 使用pythonic方法生成不同的构造函数如下:

class Toolbox:
    def __init__(self, tA=None, tB=None):
        if not tA:
            tA = ("nail", "screw")

        if not tB:
            tB = ("hammer", "nail", "long nail")

        self.trayA = tA
        self.trayB = tB

    def __str__(self):
        return "trayA=%s, trayB=%s" % (self.trayA, self.trayB)


a = Toolbox()
b = Toolbox(('bolt', 'nut'))
c = Toolbox(('bolt', 'nut'), ('saw', 'chisel'))


print(a)
print(b)
print(c)

输出

^{pr2}$

python也将此方法用于pythontype()。 可以检查变量类型:

>>> x="str"
>>> type(x)
<class 'str'>

或者你可以用它来上课。在

class A:
    pass
x = A()
print(type(x))

等于:

A = type("A", (), {})
x = A()
print(type(x))

谢谢你们的建议。 根据johngordon和AndMar先前提供的使用*argv的建议,我修改了代码以处理多个参数输入。在

class Toolbox:
trayA = ()
trayB = ()
def __init__(self,*argv):
    if len(argv) == 2:
        self.trayA = argv[0]
        self.trayB = argv[1]
    else:
        self.trayA = ("nail", "screw")
        self.trayB = ("hammer", "nail", "long nail")
def printContents(self,a):
    print("Init Arguments Count Used = ",a)
    print(self.trayA)
    print(self.trayB)
    print("")


#Initialize and Print
tb = Toolbox()
tb.printContents(0)

tb = Toolbox(("n1","n2","n5"),("screwdriver","long screw"))
tb.printContents(2)

tb = Toolbox(("n1","n2","n5"),("screwdriver","long screw"),("n3","n7","drill bit"))
tb.printContents(3)

结果

^{pr2}$

相关问题 更多 >

    热门问题