モジュール自体をインポートしてから、そのクラスメンバーを取得する必要があります。クラスをインポートするだけでは不十分です。サブクラスがpythonpathから「animal」としてアクセス可能なファイルにあると仮定します。
mod = __import__('animal')
spot = mod.Dog(5)
モジュールをインポートすると、インタプリタは最初にその名前のモジュールがに存在するsys.modules
かどうかを確認し、そこで見つからない場合は、指定された名前に一致するパッケージまたはモジュールを探してpythonpathを検索します。見つかった場合は、その中のコードを解析し、そこからモジュールオブジェクトを構築して配置しsys.modules
、モジュールオブジェクトを呼び出し元のスコープに返して、指定された名前空間でインポートされた名前にバインドします。モジュールスコープ内のモジュール内のすべてのアイテム(クラス、変数、関数)(コード内の他の何かの中にネストされていない)は、そのモジュールインスタンスのメンバーとして使用できます。
編集:
あなたのコメントに応えて、本当の問題は、モジュールの属性を動的に検索しようとしていることであり、何かを動的にインポートしようとしていることではありません。これを行う最も直接的な方法は次のとおりです。
import sub_animal
getattr(sub_animal, 'Dog')
ただし、いくつかの条件に基づいて初期化するクラスを動的に決定しようとしている場合は、ファクトリパターン、場合によってはdecorator
sまたはmetaclass
esを読み取って、サブクラスをファクトリに自動的に動的に追加できるようにする必要があります。
class AnimalFactory(type):
animal_classes = {}
def __new__(cls, name, bases, attrs):
new_class = super(AnimalFactory, cls).__new__(cls, name, bases, attrs)
AnimalFactory.animal_classes[name] = new_class
return new_class
@classmethod
def build(cls, name, *args, **kwargs):
try:
klass = cls.animal_classes[name]
except KeyError:
raise ValueError('No known animal %s' % name)
return klass(*args, **kwargs)
class Animal(object):
__metaclass__ = AnimalFactory
def __init__(self, age):
self.age = age
def speak(self):
raise NotImplementedError()
# As long as the file it is implemented in is imported at some point,
# the following can be anywhere
class Dog(Animal):
def speak(self):
return 'woof'
# And then to use, again, anywhere
new_animal = AnimalFactory.build('Dog', 5)