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



代码中的问题:

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实例变量放在类主体的构造函数之外。如果我在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)

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

对此的任何评论都是非常赞赏的。谢谢你的帮助。

可以修改@classmethod方法以提供替代方案构造函数,它不调用默认构造函数(init(。相反,使用new创建一个实例。

根据@Andrzej Pronobis

相关内容

  • 没有找到相关文章

最新更新