在python中作为构造函数参数

时间:2013-12-08 23:41:49

标签: python constructor

函数是否可以用作python __init__方法的参数?

我要做的是为感知器和逻辑回归学习算法编写一个类。由于它们的训练函数非常相似,并且只是用于预测的函数真的不同,所以能够在构造时指定这个函数函数会很好。

我希望之前没有问过这个问题(我搜索过,没找到任何东西;也许我正在寻找错误的主题)。一个例子就是很棒。我对lambda并不熟悉,所以请为任何高级python功能提供一些理由。谢谢!

2 个答案:

答案 0 :(得分:4)

是。函数是Python中的第一类对象,因此您可以将它们作为参数传递给您喜欢的任何函数,包括__init__

def a():
    print("Hello!")

def b(fun):
    print("running fun")
    fun()
    print("all done")

b(a) # prints "running fun", then "Hello!", then "all done".

您可以像其他任何变量一样将它们存储在类中:

class c(object):
    def __init__(self, fun):
        self.fun = fun
        self.fun()

lambda只是编写函数的另一种方式,无需将其存储在变量中。它可以用于动态定义函数,例如:

def d(fun, num):
    return fun(num)

def e(x):
    return x**2

d(lambda x: x**2, 7) # Returns 49
d(e) # Also returns 49

答案 1 :(得分:1)

是的,函数是第一类对象,可以作为参数传递。

简短演示:

>>> def foo(): print 'foo!'
... 
>>> bar = foo
>>> bar()
foo!
>>> def ham(eggs):
...     eggs()
... 
>>> ham(bar)
foo!

注意我是如何将foo分配给新名称bar,然后从bar调用它并将其传递给另一个函数,其中参数egg被调用为一个功能。

Lambdas只是一种创建函数对象的简短表示法。从Python的角度来看,差别很小:

>>> baz = lambda: 'baz'
>>> baz()
'baz'
>>> baz
<function <lambda> at 0x10f15c7d0>
>>> foo
<function foo at 0x10f15c6e0>

baz lambda和前面的foo函数都是函数对象。