Python では、クラスもオブジェクトです。これはすべて次のことを行います。
class Test(object):
def __init__(self):
print "WORKS!"
クラス オブジェクトを作成し、それを name にバインドしますTest
。これと同じくらい:
x = []
リスト オブジェクトを作成し、それを name にバインドしますx
。
Test()
インスタンスを作成するための魔法の構文ではありません。はTest
完全に通常の変数検索であり、()
完全に通常の「空の引数での呼び出し」です。クラスを呼び出すと、そのクラスのインスタンスが作成されることがあります。
その場合、クラスの名前を文字列として持つことに基づいて選択されたクラスをインスタンス化するという問題は、変数に格納されているオブジェクトを見つけるというより単純な問題に帰着します。x
これは、 string を指定して name にバインドされたリストを取得するのとまったく同じ問題"x"
です。古い変数でクラスへの参照を取得したら、それを呼び出してインスタンスを作成するだけです。
globals()
グローバルの名前をその値にマッピングする辞書を返します。したがって、リストを取得するのと同じくらい簡単にglobals()['Test']
クラスを取得できます。ただし、通常、このように使用するのは優れたスタイルとは見なされません。あなたのモジュールには、関数がそれらの名前を返すように作成できる場合、誤って呼び出されたくない多数の呼び出し可能オブジェクト (他のモジュールからインポートされた束を含む) が含まれている可能性があります。クラスは普通のオブジェクトに過ぎないので、自分で作成した辞書に入れることができます:Test
globals()['x']
globals()
classes = {
'Test': Test,
'SomethingElse': Something,
...
}
これにはもう少し入力が必要ですが、意図した使用法が何であるかを確認するのも簡単です。また、この辞書を他のモジュールに簡単に渡してインスタンス化を別の場所で行うこともできるため、柔軟性が少し高くなります (それはglobals()
、しかし、あなたは非常に奇妙になっています)。
さて、存在のためtype(room)
にtype
。繰り返しますが、これはクラス自体もオブジェクトであるという事実の単なる結果です。クラスがオブジェクトである場合、クラスのインスタンスでもある必要があります。それは何のクラスですか?type
、「タイプのタイプ」。クラスがすべてのインスタンスの共通の動作を定義するのと同じように、クラスはtype
すべてのクラスの共通の動作を定義します。
そして、あなたの頭を悩ませるのtype
は、それ自体のインスタンスです (type
もクラスでありtype
、クラスのクラスであるため)。そして、それは (すべてのインスタンスはインスタンスですが、すべてのインスタンスがインスタンスであるとは限らないため)のサブクラスであり、object
(すべてがインスタンスであるルート クラスであるため) のインスタンスでもあります。type
object
object
type
object
object
type
ただし、通常は高度なトピックとして無視できます。:)