Python缺少必需的位置参数。给出了无意义的位置

时间:2013-09-15 04:52:46

标签: python exception

我正在使用Python开发一个小项目。为了方便起见,我设置了一个需要多个初始化程序的类。 Python一直在告诉我我缺少位置参数,但是我没有在没有明确传递正确数字的地方调用初始化器。我试图在一个较小的测试用例中复制问题,但我不能让它做同样的事情。这是一些代码,所以它托管在:https://gist.github.com/anonymous/6568115

它给出的错误是:

  File "./cards.py", line 40, in types
    if is_subset(types, self.__class__().VALID_TYPES):
TypeError: __init__() missing 5 required positional arguments: 'name', 'types', 'colors', 'land_type', and 'required_types'

3 个答案:

答案 0 :(得分:5)

self.__class__()正在调用初始化程序。只需使用self.__class__.VALID_TYPES甚至self.VALID_TYPES

即可

答案 1 :(得分:2)

如果类名是Dog而d是Dog的实例,那么:

d.__class__() 

相当于:

(d.__class__)()

相当于:

(Dog)() 

相当于:

Dog()

同样,您将了解到python方法实际上只是类中的函数,而调用是:

d.bark() 

相当于:

(d.bark)()

导致python查找d.bark,如果在Dog类中找到函数,python将函数转换为方法(包含d的对象,以便d可以隐式传递给方法),然后python返回方法:

(method_obj)()

然后尾随括号执行方法。

答案 2 :(得分:2)

有两个主要错误:

  1. __class__是任何对象的数据成员(并包含对象的类),调用类对象会返回一个实例,因此self.__class__()(self.__class__)()相同将尝试创建同一类self的新实例,但不将任何参数传递给构造函数。

  2. 你不是用Python编程

  3. 第二个错误是非常大的错误,你应该尽快纠正它。

    在Python中,您可以编写一个2d-point类作为

    class P2d:
        def __init__(self, x, y):
            self.x = x
            self.y = y
    

    而不喜欢

    class P2d(object):
        def __init__(self, x, y):
            self._x = x
            self._y = y
    
        @property
        def x(self):
            return self._x
    
        @x.setter
        def x(self, value):
            self._x = value
    
        @property
        def y(self):
            return self._y
    
        @x.setter
        def y(self, value):
            self._y = value
    

    所有这些噪音都不是在Python中用于它的乐趣(例如Java)。您只需稍后使用数据成员即可开始(仅限于,如果真的需要),您可以将x替换为_x和getter / setter而无需更改你班上用户的任何内容。

    只是设置和获取数据成员的setter / getter对完全是胡说八道。

    使用Python语法编写Java是出于许多不同原因的错误。如果你想用Java编程,因为你想输入并阅读很多样板语法,那么就使用Java。