大多数pythonic方式处理用于实例化类的参数组合?

时间:2014-10-23 20:58:33

标签: python oop code-cleanup

我们说我有一堂课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

用户可以将该类与abc一起使用。如果提供了a,则会忽略bc

更好的是:提供所有三个参数时出错(确保程序员知道正在使用哪个参数)或将其放入bc将被忽略的文档中是提供了吗?

一方面,错误更明确,这是pythonic( Explicit比隐式更好)。另一方面,接受任何有效的工作都是更实际的(虽然实用性胜过纯洁)。

1 个答案:

答案 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创建实例,您就可以同时从bc创建实例。

这是一种常见的模式;如果您有多种方法来生成实例,请以类方法的形式提供其他工厂方法。

例如,您可以使用以下内容生成datetime.date()