我有以下情况:
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
,但是我只想在内部执行此操作,标准方法应该是传递{{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)
重建时,如何实现O
和a
?
我可以使用避免调用b
的类方法吗?
(注意:我正在寻找一种“干净的”方式来做到这一点。我知道我可以剖析参数列表或执行类似的操作
__init__
但这似乎是一个很尴尬的解决方案。)
答案 0 :(得分:1)
您可以将O
,a
和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')