Python 如何编写同时接受值列表和每个值的类构造函数

Python 如何编写同时接受值列表和每个值的类构造函数,python,class,oop,constructor,Python,Class,Oop,Constructor,假设我有一个列表lst=[1 2 3](作为一个例子),我想写一个名为Vector的类。当我将此列表传递给向量时,即当我实例化向量(lst)时,它应该给出与我希望传递此列表时相同的对象,如下所示:向量(*lst)。更准确地说,当我想要有 向量(lst)=向量(*lst) 它应该是一个三维矢量。我试过了 def __init__(self,x,y,z): # constructor self.x = x self.y = y

假设我有一个列表
lst=[1 2 3]
(作为一个例子),我想写一个名为
Vector
的类。当我将此列表传递给
向量时,即当我实例化
向量(lst)
时,它应该给出与我希望传递此列表时相同的对象,如下所示:
向量(*lst)
。更准确地说,当我想要有

向量(lst)=向量(*lst)

它应该是一个三维
矢量
。我试过了

def __init__(self,x,y,z): # constructor
            self.x = x
            self.y = y
            self.z = z  
但这会产生一个错误:

Traceback (most recent call last):
  File "main.py", line 12, in <module>
    test.assert_equals(Vector(examples[0]), Vector(*examples[0]))
TypeError: __init__() missing 2 required positional arguments: 'y' and 'z'
回溯(最近一次呼叫最后一次):
文件“main.py”,第12行,在
test.assert_等于(向量(示例[0]),向量(*示例[0]))
TypeError:\uuuu init\uuuuu()缺少2个必需的位置参数:“y”和“z”

我做错了什么?

编译器不会试图找出一个参数应该解包;您可以选择将此逻辑放入
\uuuuu init\uuuuu
本身(不推荐,因为如果希望iterable参数按原样使用而不是解包,则会很棘手),或者定义一个类方法作为创建
向量的替代方法

class Vector:
    def __init__(self, x, y, z):
        ...

    @classmethod
    def from_list(self, lst):
        # Raises an IndexError if the list is too short,
        # and silently ignores values in lst[3:]
        return Vector(lst[0], lst[1], lst[2])

coords = [1, 2, 3]
v1 = Vector(*coords)
v2 = Vector.from_list(coords)

您可以在
\uuuu init\uuuuu
中进行检查,尽管这并不是chepner回答中提到的建议,因为这允许提供更多模棱两可的输入,因此您需要进行更多检查。但如果您想这样做,这里有一个简单的实现:

class Vector:

    def __init__(self, *args):
        if len(args) == 1 and isinstance(args[0], list):
            args = args[0]
        self.x, self.y, self.z = args


输出:

{'x': 1, 'y': 2, 'z': 3}
{'x': 1, 'y': 2, 'z': 3}

def\uuu init\uuu(self,*args):
?然后可以检查args元组是否包含单个序列。如何获得向量(…)==Vector(*…)相等?我必须写两个init模块?你不需要;你为什么希望它们是一样的?如果两件事情看起来不同,理想情况下它们应该做不同的事情;此外,我应该编写以下程序:Vector([a,b,c])#从提供的3D数组中创建一个新的向量。向量(a,b,c)#同上
{'x': 1, 'y': 2, 'z': 3}
{'x': 1, 'y': 2, 'z': 3}