2016-04-24 11 views
3

複数のファイルにまたがって継承したクラスの定義に苦労しています。ファイル間のクラス継承

私は長い間検索してきましたが、いくつかの例が見つかりましたが、私の問題を解決したものはありませんでした。

file1.py:

from file2 import SubClass 

class MainClass: 
    def __init__(self): 
    print("This is MainClass") 

mc = MainClass() 
mc.SaySomething() 

file2.py:

私の目標は、複数のファイルに巨大なクラスを分割することである
from file1 import MainClass 

class SubClass(MainClass): 
    def SaySomething(self): 
    print("This is the subclass") 

、各例に

レッツ・ダイビングいくつかの関連する機能を含んでいます。

さまざまな組み合わせを試しましたが、いつもエラーが表示されます。もちろん、何かを変更した場合とは異なりますが、結果は同じです。それは動作しません。

私は、それぞれのファイルをお互いにインポートしようとする方法に関連していると思いますが、私はそれを行う方法を理解していないので、誰かがそれを解決し、それを私に説明してくれることを願っています。

実際には、第3のファイルはメインクラスをインポートして実行します。私はファイルfile2をインポートするので、file1.pyをインポートする必要があると思う - そうでなければ私を修正してください。

これはその部分です。しかし、もし私がオブジェクトの中に複数のネストされたモジュール/関数を作ることができる方法があるのであれば、私は興味があります。

私は例がそれをよりよく説明すると確信しています。

mc = MainClass() 
mc.SubClass.SaySomething() 

...ちょうどmc.SaySomething()の代わりにすることはできますか?このようにしてコードのより良い構造を保つことができます。

+0

これは循環インポートと呼ばれます。 file1では、smthをインポートします。 file2から、その逆も同様です。これはほとんどの場合、デザインを変更する必要があることを示しています。 – schwobaseggl

+3

'from file2 import SubClass'は不要です。あなたは' SubClass'を使用していません。 –

+0

私はfile1.pyがサブクラスが定義されていることを知るべきかどうか分かりません。 –

答えて

-1

あなたがしたいと思うことは、あなたはしないでください。

たぶん、あなたは私はあなたが以下の例でそれを理解してほしい、多重継承をしたい:「あなたはdiferentファイルにあなたのクラスを分割して、MainClassを作ることができるこの方法では

class A: 
    def __init__(self, number): 
     self.number = number 

    def increase(self): 
     self.number += 1 

class B: 
    def __init__(self, number): 
     self.number = number 

    def decrease(self): 
     self.number -= 1 

class AB(A, B): 
    def __init__(self, number): 
     self.number = number 

ab = AB(10) 
ab.increase() 
print ab.number 

が、私はドンそれが最善の方法だと思います。

+0

Pythonでは循環インポートが可能であることに注意してください。 – mwm314

0

依存関係を最小限に抑える複数のクラスを作成するために、コードをリファクタリングすることができます(自己完結型であるため)。次に継承の代わりにの構成を試してください。これは、親子関係の代わりにダックタイピングを採用することを意味します。継承ルートは機能しません。これは、奇妙な循環インポートを意味するためです。だから、代わりにあなたはいつもそれが読みやすくなるように、それをクリーンアップする、あなたの設計を見直す必要がある好むこのすべての

# a.py 
class A: 
    # some code 
# b.py 
import a 
class B: 
    aobj = a.A() 
    # go on using aobj 

しかし、。さらに、コードの一部が何らかの検査の後に無関係であると判明した場合、一見大きいクラスが複数のチャンクにきれいに分割される可能性があります。