假设我有一个类 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

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

一方面,错误更显式,这是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 创建实例,要么从 bc 一起创建实例。

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

例如,您可以使用以下命令生成 datetime.date() 类:
  • standard year, month and day , date(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/

    10-11 22:34
    查看更多