私はLearn Python the hard wayから学んでいます。ここで、クラスがオブジェクトのように使用できるかどうかを知りたいと思っているスタディドリルに遭遇しました。
私が実験したように:
_class A(object):
def __init__(self):
print "in here"
def cat(self,name):
print "my cat ",name
_
ここで私がA.cat(A(),"Tom")
を書いた場合、それは機能し、その非バインドメソッドを呼び出すことがわかりました。さて、それはクラスがオブジェクトのように使用できると想定できるということですか?
Python内のすべては、クラスを含むオブジェクトです。
つまり、クラスを参照し、引数のように渡し、属性、(追加の)名前、リスト、辞書などに保存できます。
これはPythonでは完全に正常です。
_class_map = {
'foo': A,
'bar': SomeOtherClass,
'baz': YetAnother,
}
instance = class_map[some_variable]()
_
現在は、インスタンスを作成するために選択されたクラスは_some_variable
_に依存しています。 _class_map
_辞書の値はすべてクラスです。
クラス自体はtype;のインスタンスです。これは metaclass と呼ばれます。名前、基本クラスのシーケンス、およびクラスの属性を定義するマッピングを指定してtype()
を呼び出すことにより、新しいクラスを作成できます。
_type('DynamicClass', (), {'foo': 'bar'})
_
たとえば、foo
属性をbar
に設定して、新しいクラスオブジェクトを作成します。生成されたクラスは、itselfを使用してインスタンスを作成できます。つまり、クラスがインスタンスを生成するのと同じように、クラスはメタクラスによって生成されます。
type
から継承して独自のメタクラスを生成し、クラスの振る舞いの奇妙で素晴らしい世界を開くことができます。
別のインスタンスを渡して非バインドメソッドを呼び出すことは、クラスをオブジェクトとして使用する良い例ではありません。最初の参照(クラス名)を使用してメソッドを検索し、self
を表す最初のパラメーターとしてクラスのインスタンスを渡しました。