在工厂方法中设置实例变量

Setting instance variables in a factory method

代码中的问题:

class Object:
  def __init__(self, x, y):
    self.a = some_logic(x)
    self.b = some_logic(y)

  @classmethod
  def produce_object(cls, x, y, additional_knowledge) -> 'Object':
    a = some_different_logic(x, additional_knowledge)
    b = some_different_logic(y, additional_knowledge)
    # now how to initialize Object?
    # bad ( I dont want to call some_logic):
    o = Object(x, y)
    o.a = x
    o.b = y
    return o

我想创建一个新实例,它以不同于构造函数的方式创建它。对于这种替代方式,我可能会使用一些额外的知识,让我可以调用 produce_object (这让我在构造函数中省去了很多昂贵的计算)。

在 Java 中,我会将 a 和 b 实例变量放在 class 主体中的构造函数之外。 如果我在 python 中这样做,它们将被视为静态成员。

我必须做这样的事情吗?:

class Object:
  def __init__(self):
    self.a = None
    self.b = None

  def former_constructor(self, x, y):
    self.a = some_logic(x)
    self.b = some_logic(y)
   
  def produce_object(self, x, y):
    self.a = some_different_logic(x)
    self.b = some_different_logic(y)

我最好的猜测(因为你不能有多个构造函数,对吧?)人们会编写一个非常通用的构造函数。这当然会导致现实世界中的复杂代码(假设你有 3 种方法来计算你的东西。一个接受类型 A 和 B,第二个 C 和 D,第三个 E 和 F。但是你总是必须提供所有东西(用可能有四个无)。

非常感谢对此的任何评论。谢谢你的帮助。

The @classmethod approach can be modified to provide an alternative constructor which does not invoke the default constructor (init). Instead, an instance is created using new.

根据@Andrzej Pronobis