0

我正在用 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'
4

3 回答 3

5

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

于 2013-09-15T05:00:18.330 回答
3

有两个主要错误:

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

  2. 你不是在用 Python 编程

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

例如,在 Python 中,您将 2d 点类编写为

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_xgetter/setter 而无需更改类用户中的任何内容。

只设置和获取数据成员的 setter/getter 对是无稽之谈。

由于许多不同的原因,使用 Python 语法编写 Java 是错误的。如果您想用 Java 编程,因为您喜欢键入和阅读大量样板语法,那么只需使用 Java。

于 2013-09-15T05:57:11.723 回答
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)()

然后尾括号执行该方法。

于 2013-09-15T05:37:52.460 回答