首页 > 解决方案 > 标准构造函数有多余信息时的第二个构造函数

问题描述

我有以下情况:

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

请注意,O 不能a和重建b。现在,我也希望能够Foo直接通过传递a和初始化b,但我只想在内部执行此操作,标准方式应该是传递O

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

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)无法和重建?我可以有一个避免调用的类方法吗?Oab__init__

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

class _Foo:
    def __init__(self, a, b):
        self.a = a
        self.b = b

class Foo(_Foo):
    def __init__(self, O):
        super().__init__(O.some_attr.cal_a(), O.some_other_attr.cal_b())

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

标签: pythonconstructor

解决方案


您可以为同一方法制作 、 和所有可选参数,Oa区分是否给出。b__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')

推荐阅读