带有" enum-like"的未绑定方法类

时间:2016-07-25 19:02:43

标签: python

请考虑以下代码:

ff = lambda x : x
gg = lambda x : x*2
class FunctionCollection(object):
    f = ff
    g = gg

def FunctionCaller(x, Type = FunctionCollection.f):
    return Type(x)

y = FunctionCaller(x)

返回

  必须使用FunctionCollection实例作为第一个参数调用

unbound method()(改为使用ndarray实例)

我不明白的消息。 一个明显的解决方案是定义ff和gg INSIDE FunctionCollection,但我想知道是否不可能在模块中定义ff和gg,然后创建一个包含"指针"对那些功能,最后传递那些"指针"作为参数。抱歉,C风格的命名。

这有什么不对?

谢谢,

麦克

1 个答案:

答案 0 :(得分:1)

您的代码实际上 在python3.x上运行。如果需要支持python2.x,可以使用staticmethod:

ff = lambda x : x
gg = lambda x : x*2
class FunctionCollection(object):
    f = staticmethod(ff)
    g = staticmethod(gg)

def FunctionCaller(x, Type = FunctionCollection.f):
    return Type(x)

y = FunctionCaller(1.0)
print(y)

另一个选择是使用FunctionCollection作为“单例”并将函数绑定到单个实例...

ff = lambda x : x
gg = lambda x : x*2
class FunctionCollection(object):
    pass

FUNC_COLLECTION = FunctionCollection()
FUNC_COLLECTION.f = ff
FUNC_COLLECTION.g = gg


def FunctionCaller(x, Type = FUNC_COLLECTION.f):
    return Type(x)

y = FunctionCaller(1.0)
print(y)
  

我想知道是否无法在模块中定义ff和gg,然后创建一个包含这些函数的“指针”的枚举,最后将这些“指针”作为参数传递。

我认为这引出了一个明显的问题......为什么你需要这种额外的间接水平?我似乎没必要 1

1 当然不是说它 是不必要的 - 只是因为我还不明白目的......