2017-06-20 11 views
0
# test1.py 
class DatabaseEngine(object): 
    pass 

# test2.py 
from test1 import DatabaseEngine 
class OracleEngine(DatabaseEngine): 
    pass 

# test3.py 
from test1 import DatabaseEngine 
class MysqlEngine(DatabaseEngine): 
    pass 

# test4.py 
# try 1 
from test1 import DatabaseEngine 
print DatabaseEngine.__subclasses__() # returns empty list 

# try 2 
from test2 import DatabaseEngine 
from test3 import DatabaseEngine 
print DatabaseEngine.__subclasses__() # returns [oracle, mysql] 

を使用すると、なぜ#1 try1は、サブクラスを認識できないが、#try 2は、そのサブクラスを認識しないとき。それを行う方法は__subclasses __()の使用、複数のPYファイルに

私は

from test2 import DatabaseEngine 
from test3 import DatabaseEngine 

を行わずtest4.pyで__サブクラス()__を使用したいがありますか?

+1

サブクラスは?ある時点でtest2.pyとtest3.pyをインポートしなかった場合、それらが宣言しているサブクラスは存在しません。あるいは、Pythonがハードディスク上のすべての.pyファイルを検索し、そのような宣言を探していると思われますか?単に 'import test2、test3'と書くことができます - それらに含まれる' DatabaseEngine'はtest1から直接インポートできるものとまったく同じです。 – jasonharper

+0

@jasonharper。ありがとう。わかりました。私が提供するタイプに基づいて工場がdbエンジンを作成する工場パターンを作成しようとしています。私が提供する型に基づいてオブジェクトを作成するために、異なるクラス名をハードコードする代わりに、すべての基本クラスとループのサブクラスをプログラム的に取得し、必要なオブジェクトを取得したかったのです。だから、もし私がmysqlエンジンを追加したいのであれば、 'DatabaseEngine'''からサブクラスを作成し、クライアントからmysql型を提供するとmysqlエンジンが得られます。 – mkarun2

+0

@jasonharper現在、ファクトリクラスには作成可能なエンジンオブジェクトのリストがあります。例えば[[OracleClassName]]。今私はmysqlを追加する必要がある場合、私はそれをサポートするために工場にコードを変更する必要があります。 – mkarun2

答えて

0

try 1が機能しませんb/cインポートでは、明示的にそのモジュールのコードが評価されます。 try 1にサブクラスを含むモジュールをインポートしないので、評価されません。

サブクラスを別のモジュールに保存し、すべてにアクセスしたい場合は、それらをすべてインポートするモジュールが少なくとも1つ必要です。

サブクラスの実装を含む別のファイルを作成し、そこにインポートすることをお勧めします。サブクラスが必要な場合は、この1つのファイルをインポートします。

関連する問題