【发布时间】:2015-04-30 02:37:30
【问题描述】:
我有一个具有 可选 函数作为参数的类。有时我用函数创建这个类的实例,有时不是。
每次调用实例的某些方法时都会调用该函数。当然,如果没有给出函数,那里什么也不会发生。
我的问题是,实现这一目标的最佳方法是什么?我尝试了几件事。你能根据性能、可扩展性和可读性来判断我的解决方案吗?你有更好的解决方案吗?
类是这样的
class MyClass(...):
def __init__(self, function=None):
self.function = function
def method_a(self, ...)
...
self.function(a,b,c)
...
def method_b(self, ...)
...
self.function(a,b,c)
...
def method_c(self, ...)
...
#not every method bothers with the function
...
当然这会产生
TypeError: 'NoneType' object is not callable
最天真的解决方案是用防御性的 if 或试验来改变类本身:
class MyClass(...):
def __init__(self, function=None):
self.function = function
def method_a(self, ...)
...
if self.function:
self.function(a,b,c)
...
def method_b(self, ...)
...
if self.function:
self.function(a,b,c)
...
第二种解决方案是创建一个什么都不做的函数,也许将它存储在self.function:
def do_nothing(*x):
pass
class MyClass(...):
def __init__(self, function=None):
if function is None:
function = do_nothing
self.function = function
def method_a(self, ...)
...
self.function(a,b,c)
...
def method_b(self, ...)
...
self.function(a,b,c)
...
第三种解决方案是创建一个包含防御性 if 的函数包装器:
class Maybe(object):
def __init__(self, function=None):
self.function = function
def __call__(self, *args):
if self.function is None:
return
# else
return self.function(args)
class MyClass(...):
def __init__(self, function=None):
self.function = Maybe(function)
def method_a(self, ...)
...
self.function(a,b,c)
...
def method_b(self, ...)
...
self.function(a,b,c)
...
【问题讨论】:
-
我会说,第二个。只需添加一个默认参数:
__init__(self, function=lambda *x: None)。 -
@georg,它不能很好地扩展。在我的示例中,我有 1 个条件函数,但这并不意味着我的程序中有 1 个。
-
你必须更具体。您正在解决的实际问题是什么?在不知道所有细节的情况下,我们只能推测。