Python认为我传递了3个参数,尽管我只传递了2个

2024-04-26 14:14:05 发布

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

我写了一个基本的向量类来处理向量。计算它们的大小等等。我有两个重载构造函数,一个接受两个参数xy,另一个接受一个元组(x,y)。你知道吗

当我初始化一个变量时,它会给我一个错误:

TypeError: __init__() takes 2 positional arguments but 3 were given.

我错过了什么?你知道吗

class Vector:

    x = 0.0
    y = 0.0

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

    def __init__(self, coordinates):
        self.x = coordinates[0]
        self.y = coordinates[1]


v1 = Vector(1,3)
print(v1.x)

Tags: self参数initdef错误arguments向量but
3条回答

Python不做重载构造函数——它是一种动态语言,不知道允许这种情况发生的类型。您的代码定义一个__init__,然后用第二个__init__完全替换它。如果您想这样做,您可以定义一个带有备用签名的工厂方法并调用它。你知道吗

Python不支持重载,所以用第二个方法覆盖第一个__init__方法。第二个只接受一个参数:coordinates。Python编写3个参数是因为实例(self)是隐式传递的。你知道吗

删除第二个__init__方法,它将正常工作。你知道吗


例如,如果您喜欢多个构造函数,可以将其他构造函数实现为classmethods

class Vector:

    x = 0.0
    y = 0.0

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

    @classmethod
    def from_list(cls, coordinates):
        return cls(coordinates[0], coordinates[1])
        # you could also use unpacking:
        # return cls(*coordinates)

测试:

>>> v1 = Vector(1,3)
>>> print(v1.x)
1
>>> v2 = Vector.from_list([2, 1])
>>> print(v2.x)
2

没有重载构造函数:第二个方法定义覆盖第一个方法定义。因此,您的only构造函数只接受两个参数。你提供的3个自我是隐含的。你知道吗

相关问题 更多 >