标准构造函数具有多余信息时的第二个构造函数

时间:2020-07-28 13:42:46

标签: python constructor

我有以下情况:

class Foo:
    def __init__(self, O):
         self.a = O.some_attr.calc_a()
         self.b = O.some_other_attr.calc_b()

请注意,无法从Oa重建b 。现在,我还希望能够通过传递Fooa来直接初始化b,但是我只想在内部执行此操作,标准方法应该是传递{{1} }。

我知道我可以做类似的事情

O

但是这样做的缺点是 standard 调用现在变得更加麻烦class Foo: def __init__(self, a, b): self.a = a self.b = b @classmethod def from_O(cls, O): return cls(O.some_attr.cal_a(), O.some_other_attr.cal_b())

换句话说,当Foo.from_O(O)不能从Foo(O)Foo.from_a_b(a,b)重建时,如何实现Oa ? 我可以使用避免调用b的类方法吗?

(注意:我正在寻找一种“干净的”方式来做到这一点。我知道我可以剖析参数列表或执行类似的操作

__init__

但这似乎是一个很尴尬的解决方案。)

1 个答案:

答案 0 :(得分:1)

您可以将Oab设为同一__init__方法的所有可选参数,并区分是否给出O或不是。

class Foo:
    def __init__(self, O=None, a=None, b=None):
         if O is not None:
             self.a = O.some_attr.calc_a()
             self.b = O.some_other_attr.calc_b()
             # ignore a and b
         else:
             if a is None or b is None:
                 raise TypeError("If O is not given, a and b cannot be None")
             self.a = a
             self.b = b

用法:

# from O
foo_from_O = Foo(O)

# from a, b
foo_from_a_b_1 = Foo(None, 'a', 'b')
foo_from_a_b_2 = Foo(a='a', b='b')