2011-08-26 17 views
19

私は、2つの関連する大きなPythonクラスが存在するため、それらを別々のファイルに入れている状況があります。たとえば、クラスはコブラとラットです。Pythonでインポートループを中断する方法

ラブのメソッドをCobraのメソッドから呼び出す必要があり、その逆もあります。 これはCobraでRat.pyとCobraでRatをインポートする必要があります

これはインポートループを作成し、エラーを出します。カントはコブラの中にコブラを輸入します。

これを修正するには?

Cobra.py

import Rat 
class Cobra(): 
    def check_prey(self, rat): 
     # Some logic 
     rat.foo() 

Rat.py

import Cobra 
class Rat(): 
    def check_predator(self, snake): 
     # some_logic .. 
     snake.foo() 
+3

あなたが表示するコードのどれもその問題を示していません。 –

+1

これは起こりません、2つのクラスはお互いを知ることができません。 'Rat'と' Cobra'クラスを使用している場合、共通の基本クラス 'Animal'はどうですか?この方法で 'Rat'と' Cobra'の両方で 'Animal'をインポートできます。 –

+5

「2つのクラスはお互いを知ることができません」というのは間違っています。ナビゲーションの双方向性はOOの基本的な特徴であり、ほとんどのOO言語、C++、Java、C#で利用可能です。 –

答えて

22

あなたはラットのクラス定義でコブラを使用するか、またはその逆、すなわち内部でのみ使用されていない場合メソッドを使用すると、import文を実際にファイルの最後に移動することができます。このとき、クラス定義はすでに存在します。

Class Cobra: 
... 
def check_prey(self, rat): 
    Some logic rat.foo() 

import Rat 


import Cobra 
class Rat 
... 
def check_predator(self, snake): 
    some_logic .. 
    snake.foo() 

またはあなたはまた、あなたが直接、ラットやコブラクラス名を使用しない場合は、あなたも、すべてのimport文を必要としない輸入

Class Cobra: 
... 
def check_prey(self, rat): 
    import Rat 
    Some logic rat.foo() 

import Cobra 
class Rat 
... 
def check_predator(self, snake): 
    some_logic .. 
    snake.foo() 

の範囲を限定することができますラットやステークのインスタンスにプロパティと関数が存在する限り、Pythonはそれらのクラスが何であるか気にしません。

一般的に、インポートループを避ける完全な証明方法はありません。あなたができることは、あなたのコードをリファクタリングし、上記のことのいくつかを行うことです。

+0

お返事ありがとうございます.. 有望な音..チェックして戻ってきます.. – Tiwari

関連する問題