大多数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