0

在 Python 中,构造函数可以接受另一个类的方法作为参数吗?

我听说你可以做这样的事情,但这个例子不起作用(目前,我得到一个“模块”对象不可调用错误):

class GeneticAlgorithm ():

    def __init__(self, population, fitness, breed, retain = .3, weak_retain = .15 ) :
        self.fitness = fitness

这里的适应度是在别处定义的函数,注意我正在导入定义函数的类。

编辑:这是实际产生错误的代码

class Solver( ):

    def __init__( self, fitness, breed, iterations ):

        self.T = Problem()

        self.fitness    = fitness
        self.breed      = breed
        self.iterations = iterations

    def solve( self ):
        P  = self.T.population(500)
        GA = GeneticAlgorithm(P, self.fitness, self.breed) # problem here


Traceback (most recent call last):
  File "C:\Users\danisg\Desktop\Other\Problem.py", line 128, in <module>
    main()
  File "C:\Users\danisg\Desktop\Other\Problem.py", line 124, in main
    t = S.solve()
  File "C:\Users\danisg\Desktop\Other\Problem.py", line 74, in solve
    GA = GeneticAlgorithm(P, self.fitness, self.breed)
TypeError: 'module' object is not callable

以及创建求解器的位置

def main():
    S = Solver(fitness, breed, 35)
    print(S.solve())

if __name__ == '__main__':
    main() 
4

3 回答 3

2

从评论中,问题的根源:

我做“导入遗传算法”。我不应该这样做吗?– 吉达尼斯

不,这实际上是不正确的。您所做的是导入模块,而不是模块内的类。您在这里有两个选择 - 做一个或另一个:

  • 将导入更改为

    from GeneticAlgorithm import GeneticAlgorithm

  • 更改 Solver 类以使用

    GA = GeneticAlgorithm.GeneticAlgorithm(P, self.fitness, self.breed)

我建议将模块从重命名GeneticAlgorithm.py为不太令人困惑的东西(genetic_algorithm.py是一个很好的候选者),然后使用第一个选项仅从该模块导入类 -from genetic_algorithm import GeneticAlgorithm

于 2013-10-24T19:37:10.213 回答
0

看一下堆栈跟踪:

  GA = GeneticAlgorithm(P, self.fitness, self.breed)
TypeError: 'module' object is not callable

它说GeneticAlgorithm是一个module,不是一个function

于 2013-10-24T19:28:01.223 回答
0

是的,你可以有这样的东西:

def eats_a_method(the_method):
    pass

def another_method():
    pass

eats_a_method(another_method)
于 2013-10-24T19:18:08.547 回答