假设我有一个类 Foo:
class Foo(object):
@staticmethod
def get_a(b, c):
if not b or not c:
raise ValueError("Invalid params!")
return b + c
def __init__(self, a=None, b=None, c=None):
if not a:
a = Foo.get_a(b, c)
self.a = a
用户可以将类与
a
或 b
和 c
一起使用。如果提供了 a,则忽略 b
和 c
。更好的是:在提供所有三个参数时出错(确保程序员知道正在使用哪个参数)或将其放入文档中,如果提供了 a,
b
和 c
将被忽略?一方面,错误更显式,这是pythonic(显式优于隐式)。另一方面,接受任何有效的东西更实用(尽管实用性胜过纯洁)。
最佳答案
我会给这个类一个单独的 classmethod
工厂:
class Foo(object):
def __init__(self, a):
self.a = a
@classmethod
def from_b_and_c(cls, b, c):
return cls(b + c)
这是真正的显式选项;您要么创建
Foo(a)
,要么使用 Foo.from_b_and_c(b, c)
生成具有非常不同参数的实例。这立即记录了参数是如何分离的;要么仅从 a
创建实例,要么从 b
和 c
一起创建实例。这是一种常见的模式;如果您有多种方法来生成实例,请以类方法的形式提供额外的工厂方法。
例如,您可以使用以下命令生成
datetime.date()
类:date(2014, 10, 23)
date.today()
date.fromtimestamp(1414018800.0)
date.fromordinal(735529)
。 关于python - 处理用于实例化类的参数组合的大多数 Pythonic 方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26537358/