2017-05-18 5 views
0

2つのファイルがあり、それぞれにクラスがあります。 int.pyは整数クラスのカスタム実装を持ち、float.pyはfloatクラスのカスタム実装を持っています。お互いに変換を持つ別々のファイルに2つのクラスを書く?

私は各クラスにもう一方の変換メソッドを持たせたいと思います。たとえば:コンストラクタが使用できるように

class Integer: 
    def __init__(self, value): 
    self.value = value 

    def to_f(): 
    return Float(self.value) 

class Float: 
    def __init__(self, value): 
    self.value = value 

    def to_i(): 
    return Integer(self.value) 

は、どのように私は循環依存を引き起こすことなく、お互いにファイルをインポートすることができますか?

+2

両方を同じファイルに入れてください。あなたは循環インポートの問題に直面しています – inspectorG4dget

答えて

2

メソッドが呼び出されたときには、クラスをインポートすることができます:それはFloat.to_iへの最初の呼び出しを超えて任意のパフォーマンスの低下を持っていないので、

class Float: 
    def __init__(self, value): 
    self.value = value 

    def to_i(self): 
    from integer import Integer 
    return Integer(self.value) 

輸入は、sys.modulesにキャッシュされます。


代替モジュール自体をインポートし、クラスをルックアップするためにある:

import integer 

class Float: 
    def __init__(self, value): 
    self.value = value 

    def to_i(self): 
    return integer.Integer(self.value) 

限り(integerFloatをサブクラスのような)は、モジュールレベルの循環依存が存在しないとして、あなたは」勝ちました何か問題があります。


さらに別の(潜在的に混乱)の代替は、モジュールの後にクラスをインポートすることである:時間Float.to_iにより

class Float: 
    def __init__(self, value): 
    self.value = value 

    def to_i(self): 
    return Integer(self.value) 


from integer import Integer 

が呼び出され、Integerスコープであろう。私は、実際のコードで使用されている最初の2つの方法を見て回想します。

0

ただ、ローカルクラスをインポート:

class Float: 
    def to_i(): 
    from .int import Integer # not run at module loading time 
    return Integer(self.value) 

class Integer: 
    def to_f(): 
    from .float import Float 
    return Float(self.value) 

これは、モジュールのロード時に実行されてからの輸入を防止し、従って、円形の輸入を回避することができます。

関連する問題