Python __init__ 和 classmethod,它们必须具有相同数量的参数吗?

Python __init__ and classmethod, do they have to have the same number of args?

所以 class 方法可以用作 python 中的替代“构造函数”,它们绑定到 class 而不是实例,到目前为止非常清楚。但我的问题是,是否必须在 class 方法的返回实例中具有与 __init__ 中相同数量的参数。更确切地说:

    class MyClass(object):
      def __init__(self,name):
         self.name=name

      @classmethod
      def alternative_init(cls,name,surname):
          return cls(name,surname)

如果我尝试创建一个实例 Myclass("alex") 工作正常,但如果我尝试创建一个实例 Myclass.alternative_init("alex","james") 我有一个 TypeError ,因为我传递给许多参数,而 init 只需要 2 。我错过了什么吗?

你可以像这样做你想做的事:

class MyClass(object):
    def __init__(self,name):
        self.name=name

    @classmethod
    def alternative_init(cls,name,surname):
        new_instance = cls(name)
        new_instance.surname = surname
        return new_instance

a = MyClass.alternative_init('Bob', 'Spongy')
print(a.name, a.surname)
# Bob Spongy

__init__ 只接受一个参数,名称。因此,您可以将 namesurname 传递给 cls,但不能同时传递两者。但是,您可以在 classmethod 中创建一个 class 实例,并添加一个额外的参数:

class MyClass(object):
  def __init__(self,name):
    self.name=name
  def __setattr__(self, name, val):
     self.__dict__[name] = val
  @classmethod
  def alternative_init(cls,name,surname):
    v = cls(name)
    v.surname = surname
    return v

因为 Myclass.alternative_init("alex","james") 调用 cls(name, surname) 与 MyClass(name,surname) 相同,也与 __init__(self,name,surname) 相同,但您的 __init__ 函数没有 surname 参数。您可以通过 __init__(self,name,surname=None)

使 surname 可选
class MyClass(object):
  def __init__(self,name,surname=None):
     self.name=name
     self.surname=surname

  @classmethod
  def alternative_init(cls,name,surname):
      return cls(name,surname)

在Python中,传递给方法的第一个参数总是对象本身。 如果您现在使用名称调用您的方法,您将获得 self 作为第一个参数,名称作为第二个参数。

当您现在从类方法内部调用 init 方法时,python 不知道它应该如何处理姓氏。

class MyClass(object):
    def __init__(self,name):
        self.name=name

    @classmethod
    def alternative_init(cls,name,surname):
        return cls(name)


a = MyClass("alex")
MyClass.alternative_init("alex","james")