2011-10-29 8 views
4

クラスを持つモジュールをインポートすると、そのクラスが最初に読み込まれ、クラスオブジェクトが作成されたときに実行されるコードはありますか?何が起こるかに影響を与える方法はありますか?クラスが定義されているときに実行されるコードは何ですか?


編集:私は、私はC++からのイントロスペクションを行うことができます何かもっと低レベルのを探しています

...私の質問は少しも一般的かもしれません実現。 C++アプリケーションをPythonで拡張します。私はC++で定義され、Pythonで公開されているいくつかのクラスを持っています。ユーザーはスクリプト内でこれらのクラスを継承することができ、最初に定義されたときにそれらのクラスの詳細を把握できます。

+0

実際にクラスを作成するために実行されるコードは、古いスタイルのクラスか新しいスタイルのクラスかによって異なります。好みのPythonバージョンを使用していますか? – Thomas

+0

@トーマスそれはPython 3にしましょう。 –

答えて

5

多くの可能性があります。最も基本的:

ブロックの内容は、最初に読み込まれるときに実行されます。

これはアクションで、この例を参照するには、次のモジュールがインポートされたときに

class Foo(object): 
    print "bar" 

    def __init__(self): 
     print "baz" 

barを印刷します。

クラスにメタクラスが定義されている場合、メタクラス__new__関数は、クラスのコードブロックの実行後に実行されます。

例:

class MyMeta(type): 
    def __new__(mcs, name, bases, kwargs): 
     print "I'm the metaclass, just checking in." 
     return type.__new__(mcs, name, bases, kwargs) 


class Foo(object): 
    __metaclass__ = MyMeta 

    print "I'm the Foo class" 

出力:

I'm the Foo class 
I'm the metaclass, just checking in. 

私は他のビットが同様に実行することができると確信していが、これらは私が精通していますまさにです。

+0

私は、C++の観点から、Pythonオブジェクトの詳細について質問していると思います。明らかに私の答えはそれには言及していませんが、質問が編集されてこの意図をより明確に述べる前にありました。 –

3

metaclassesは、クラスの作成を制御するクラスです。

4

BとCを継承するクラスAを定義すると、A = type('A', (B, C), mが実行されます。mはクラスのメンバーを含む辞書です。

メタクラスプログラミングを使用してプロセスに影響を与えることができます。 blog poststutorials on the subjectの不足はありません。

2

クラス定義のコードは他のコードと同じように実行されますが、作成された変数(関数定義を含む)はグローバルではなくクラスのコンテキストになります。それはむしろunpythonic感じている - 私はこれが行わ見たことがない、それを行う理由を考えることはできませんしかし

class A(object): 
    if 1==2: 
     def f(self): 
      print "the world has gone mad" 
    else: 
     def f(self): 
      print "sanity rules" 

>>> a = A() 
>>> a.f() 
sanity rules 
>>> 

:これは、あなたが条件付きコードを追加することによって、動的にクラス定義を変更できることを意味します。

メタクラス、継承、クラスデコレータなど、クラスの動作を変更する方法は他にもたくさんあります。

0

Pythonモジュールがインポートされると、モジュールレベルのすべてのクラスコードが実行され、それらのクラスのメタクラスも実行されます。これはクラスが存在するようになります。

C++がコンパイルされています。クラスはインポート時にすでに存在しています。既に作成されているので、作成方法を制御する方法はありません。

関連する問題