Python 对具有定义数量的参数的类使用多个构造函数

Python 对具有定义数量的参数的类使用多个构造函数,python,python-3.x,class,Python,Python 3.x,Class,我正在尝试为Atom类实现一个替代构造函数。然而,我不知道如何在与_lammps不同的情况下获得一个只包含给定参数的对象 您可以实现一个只包含如下给定参数的替代构造函数。请注意,传递给classmethod的第一个参数是正在实例化的类 class Atom: def __init__(self,x,y,z,element,charge,notused,fx,fy,fz): self.x=float(x) self.y=float(y) se

我正在尝试为Atom类实现一个替代构造函数。然而,我不知道如何在与_lammps不同的情况下获得一个只包含给定参数的对象

您可以实现一个只包含如下给定参数的替代构造函数。请注意,传递给classmethod的第一个参数是正在实例化的类

class Atom:
    def __init__(self,x,y,z,element,charge,notused,fx,fy,fz):
        self.x=float(x)
        self.y=float(y)
        self.z=float(z)
        self.element=str(element)
        self.charge=float(charge)
        self.notused=int(float(notused))
        self.fx=float(fx)
        self.fy=float(fy)
        self.fz=float(fz)

    @classmethod
    def from_lammps(self,element,x,y,z):
        self.x=float(x)
        self.y=float(y)
        self.z=float(z)
        self.element=str(element)
输出:

瓦萨托姆1= {'charge':3.1415, “元素”:“锌”, “fx”:4.0, “fy”:5.0, “fz”:6.0, “未使用”:42, “x”:1.0, “y”:2.0, “z”:3.0} varsatom2= {'element':'silver','x':6.0,'y':7.0,'z':8.0}
您是否检查过:为什么不使用**kwargs而不是参数列表?@maverick6912,它似乎再次调用init方法。无法将None与省略的参数与提供的参数相关联answer@fireball.1您读过这篇文章了吗?您想要的只是位置参数/参数?在呼叫签名中使用不同的顺序?
class Atom:
    def __init__(self, x, y, z, element, charge, notused, fx, fy, fz):
        self.x = float(x)
        self.y = float(y)
        self.z = float(z)
        self.element = str(element)
        self.charge = float(charge)
        self.notused = int(float(notused))
        self.fx = float(fx)
        self.fy = float(fy)
        self.fz = float(fz)

    @classmethod
    def from_lammps(cls, element, x, y, z):
        obj = object.__new__(cls)
        obj.x = float(x)
        obj.y = float(y)
        obj.z = float(z)
        obj.element = str(element)
        return obj


from pprint import pprint, pformat

atom1 = Atom(1, 2, 3, 'zinc', '3.1415', 42, '4', '5', '6')
print(f'vars(atom1) =\n{pformat(vars(atom1))}')
print()
atom2 = Atom.from_lammps('silver', '6', '7', '8')
print(f'vars(atom2) =\n{pformat(vars(atom2))}')