我们说我有一堂课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
。
更好的是:提供所有三个参数时出错(确保程序员知道正在使用哪个参数)或将其放入b
和c
将被忽略的文档中是提供了吗?
一方面,错误更明确,这是pythonic( Explicit比隐式更好)。另一方面,接受任何有效的工作都是更实际的(虽然实用性胜过纯洁)。
答案 0 :(得分:6)
我会给班级一个单独的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)
。