2013-10-24 2 views
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 

И где Solver создается

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

if __name__ == '__main__': 
    main() 
+5

Пожалуйста, разместите код, который действительно вызывает ошибку. –

+0

Для начала: 1. Ваш отступ выключен ('def' должен быть отступом, если его часть класса GeneticAlgorithm). 2. Генетический алгоритм должен наследовать от объекта. – Gerrat

+0

Короче говоря, да, это может (если бит iffy из-за аргумента 'cls' /' self' в методе), но нам нужен код и ошибка, чтобы узнать, почему ваш код неверен – Izkata

ответ

0

Да, вы могли бы иметь что-то вроде этого:

def eats_a_method(the_method): 
    pass 

def another_method(): 
    pass 

eats_a_method(another_method) 
0

Посмотрите на трассировку стека:

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

В нем говорится, что GeneticAlgorithm является module, а не function.

2

Из комментариев, корень вопроса:

я `импорт GeneticAlgorithm». Я не должен этого делать? - gjdanis

Нет, это не совсем правильно. То, что вы сделали, - это импортировать модуль, а не тот класс, который находится внутри модуля. У вас есть два варианта здесь - сделать один или другой:

  • Изменение импорта в

    from GeneticAlgorithm import GeneticAlgorithm

  • Изменить класс Solver использовать

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

Я бы предложил переименовать модуль для m GeneticAlgorithm.py, что-то, что не совсем сбивает с толку (genetic_algorithm.py - хороший кандидат), затем используя первый вариант для импорта только класса из этого модуля - from genetic_algorithm import GeneticAlgorithm

Смежные вопросы