web-dev-qa-db-ja.com

Pythonでオブジェクトのようなクラスを使用する

私は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")を書いた場合、それは機能し、その非バインドメソッドを呼び出すことがわかりました。さて、それはクラスがオブジェクトのように使用できると想定できるということですか?

2
Angel

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を表す最初のパラメーターとしてクラスのインスタンスを渡しました。

2
Martijn Pieters