在工厂方法中设置实例变量
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
代码中的问题:
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