假设我有一个 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
.如果提供了,b
和 c
被忽略。
更好的是:在提供所有三个参数时出错(确保程序员知道正在使用哪个参数)或将其放入 b
的文档中和 c
如果提供 a 会被忽略吗?
一方面,错误更显式,这是 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()
类:
- standard year, month and day ,
日期(2014, 10, 23)
- 来自您的 system date ,
date.today()
- 来自POSIX timestamp ,
date.fromtimestamp(1414018800.0)
- 来自ordinal (days since 0001-1-1) ,
date.fromordinal(735529)
。
关于python - 处理用于实例化类的参数组合的大多数 pythonic 方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26537358/