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或两者b并c.如果提供,b并且c被忽略.
更好的是:提供所有三个参数时出错(确保程序员意识到正在使用哪个参数)或将其放入文档中b并且c如果提供了将被忽略的文档?
一方面,错误更明确,这是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)
Run Code Online (Sandbox Code Playgroud)
这是真正的明确选项; 您要么创建Foo(a),要么使用Foo.from_b_and_c(b, c)生成具有非常不同参数的实例.这会立即记录参数是如何分开的; 要么你从刚刚创建一个实例a,或者创建从两个实例b和c在一起.
这是一种常见的模式; 如果您有多种方法来生成实例,请以类方法的形式提供其他工厂方法.
例如,您可以生成一个datetime.date()类:
date(2014, 10, 23)date.today()date.fromtimestamp(1414018800.0)date.fromordinal(735529).