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

标签 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

用户可以通过 a 使用该类或两者 bc .如果提供了,bc被忽略。

更好的是:在提供所有三个参数时出错(确保程序员知道正在使用哪个参数)或将其放入 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 创建实例,或者 同时从 bc 创建实例。

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

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

关于python - 处理用于实例化类的参数组合的大多数 pythonic 方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26537358/

相关文章:

python - Flask_login.current_user.is_authenticated 与 Flask-dance facebook.authorized

Python XMLRPC : Handling arbitrary exceptions on client-side

python - Tkinter 字体大小仅影响 Raspberry pi 上字母之间的间隙

C++ 原始类型初始化 vs.对象初始化

c++ - 无法找出正确的方法(模式...)

java - TDD 最佳实践 - Java 对象验证和干净代码

ruby-on-rails - 订阅!干净的字符串,去掉撇号

iphone - 避免代码中的调试内容困惑

inversion-of-control - 惰性初始化 - 如何使其成为干净的代码并消除硬依赖?

python - 如何让 Bottle 在文件更改时重新启动?