0

Pythonでは、コンストラクターは別のクラスのメソッドを引数として取ることができますか?

このようなことができると聞いたことがありますが、この例は機能していません (現在、「モジュール」オブジェクトは呼び出し可能ではありませんというエラーが発生しています)。

class GeneticAlgorithm ():

    def __init__(self, population, fitness, breed, retain = .3, weak_retain = .15 ) :
        self.fitness = 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

コメントから、問題の根源:

「GeneticAlgorithm のインポート」を行います。私はこれをすべきではありませんか?– ギダニス

いいえ、それは実際には正しくありません。あなたが行ったことは、モジュール内にあるクラスではなく、モジュールをインポートすることです。ここには 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

はい、次のようなものがあります。

def eats_a_method(the_method):
    pass

def another_method():
    pass

eats_a_method(another_method)
于 2013-10-24T19:18:08.547 に答える