python - 标准构造函数有多余信息时的第二个构造函数
问题描述
我有以下情况:
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)
无法从和重建?我可以有一个避免调用的类方法吗?O
a
b
__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())
但这似乎是一个相当尴尬的解决方案。)
解决方案
您可以为同一方法制作 、 和所有可选参数,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')
推荐阅读
- tensorflow - 张量具有 NaN 值
- vue.js - 如何处理 Nativescript Vue 应用程序上的导航?
- javascript - Javascript。为什么调用方法时不用括号?
- tensorflow - tf.py_function 和 tf.function 在用途上有什么区别?
- javascript - ComponentDidMount 在重定向回调之前被触发
- scala - 如何更新数据框 Spark Scala 单元格中的值
- json - 在 JSON 示例表单 Real World Haskell 中使用类型类
- python - 通过 Ubuntu 的 apt-get 在 Dockerfile 中使用 apt-get 安装 python-pip
- java - OpenJDK 14.0.1 给出“switch 表达式不涵盖所有可能的输入值”
- java - 使用默认值创建 ConcurrentHashMap