2012-08-13 4 views
6

、私はいくつかの機能を持つクラスを持っている場合:私は「例」の複数のインスタンスを作成する場合のPython:クラスの機能とメモリ

class Example: 

    def func1(self): 
     print 'Hi1' 
    def func2(self): 
     print 'Hi2' 
    def func3(self): 
     print 'Hi3' 

、各インスタンスは、クラス内の関数の独自のコピーを保存しません?あるいは、Pythonは定義を一度しか格納せず、インスタンスがクラス内の関数を使うたびにそれを調べるスマートな方法を持っていますか?

また、静的関数についてはどうですか?クラスは各静的関数のコピーを1つだけ保持しますか?

+0

私はこれが意味するパフォーマンスの違いを理解していません。 – rsegal

+0

私はクラスのインスタンスを何百万もインスタンス化しているので、メモリがどのように影響を受けるかを理解する必要があります。 –

答えて

12

クラスをインスタンス化するときに、インスタンスメソッドや静的メソッドのいずれの新しい関数オブジェクトも作成されません。 obj.func1を経由してインスタンスメソッドにアクセスすると、「バインドされたメソッド」と呼ばれる新しいラッパーオブジェクトが作成されます。これは、必要なだけ保持されます。ラッパーオブジェクトは軽量で、基礎となる関数オブジェクトとインスタンスへのポインタを基本的に含みます(関数が呼び出されたときにパラメータselfとして渡されます)。

staticmethodを使用することは、ほとんどの場合、Pythonの間違いです。その存在は歴史的な間違いである。静的メソッドが必要と思われる場合は、通常、モジュールレベルの関数が必要です。

+0

静的メソッドについての良いメモ –

+0

関数オブジェクト自体はバイトコードを共有できます(また、実行する)こと、またIIRCはメタデータ(名前、モジュール、ドキュメントストリング、キャプチャされた変数など)の上にのみ追加することに注意してくださいそれ。 – delnan

+0

@delnan:これは* local *関数、つまり関数内で定義された関数にのみ当てはまります。クラス本体は1回だけ実行され、クラス本体の関数の場合は、関数オブジェクトとコードオブジェクトの間に1対1の対応があります。 –

0

これらの関数は、静的でも非静的でもクラスに「格納」されています。