编程语言
首页 > 编程语言> > 大多数pythonic方式处理用于实例化类的参数组合?

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

作者:互联网

假设我有一堂课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

用户可以将该类与b和c中的一个或两个一起使用.如果提供了a,则忽略b和c.

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

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

解决方法:

我会给班级一个单独的类方法工厂:

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).

标签:code-cleanup,python,oop
来源: https://codeday.me/bug/20190824/1713146.html