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

Tem*_*muz 3 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
Run Code Online (Sandbox Code Playgroud)

用户可以使用类要么a或两者bc.如果提供,b并且c被忽略.

更好的是:提供所有三个参数时出错(确保程序员意识到正在使用哪个参数)或将其放入文档中b并且c如果提供了将被忽略的文档?

一方面,错误更明确,这是pythonic(显式优于隐式).另一方面,接受任何工作更实际(虽然实用性胜过纯度).

Mar*_*ers 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)
Run Code Online (Sandbox Code Playgroud)

这是真正的明确选项; 您要么创建Foo(a),要么使用Foo.from_b_and_c(b, c)生成具有非常不同参数的实例.这会立即记录参数是如何分开的; 要么你从刚刚创建一个实例a,或者创建从两个实例bc在一起.

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

例如,您可以生成一个datetime.date()类: