我正在使用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'
答案 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)
有两个主要错误:
__class__
是任何对象的数据成员(并包含对象的类),调用类对象会返回一个实例,因此self.__class__()
与(self.__class__)()
相同将尝试创建同一类self
的新实例,但不将任何参数传递给构造函数。
你不是用Python编程
第二个错误是非常大的错误,你应该尽快纠正它。
在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。