Pythonで魔法の方法

コンストラクタ

私たちの最も基本的な魔法の方法が知られている__init__、我々は、オブジェクトの振る舞いが初期化されている指定するためにそれを使用することができます。私たちが呼ぶときしかし、
x = SomeClass()時間を、__init__呼び出された最初の方法ではありません。実際には、と呼ばれる最初は__new__、この、
この方法は実際にそれのインスタンスを作成します。このオブジェクトのライフサイクルの終わりには、ときに__del__呼び出されます。私たちはこれらの3つの方法の近くに理解をしてみましょう:

  • __new__(cls,[...)

    __new__第1の方法は、オブジェクトがインスタンス化されるとき、それだけ除去されると呼ばれるclsパラメータを、およびパラメータは他に渡されます__init____new__
    ほとんど使用されませんが、それはときタイプ、頻繁に変更しないクラスは、文字列のピクセルまたはグループから継承する場合は特に、また、シーンに適しています。私はしませんが
    __new__、それは非常に有用ではありませんので、Python文档 <http://www.python.org/download/releases/2.2/descrintro/#__new__>中_
    詳しい説明。

  • __init__(self,[...])

    クラスの初期化方法。それは、私たちの呼び出しなど、コンストラクタ(に任意の引数を取得しx = SomeClass(10, 'foo')__init__彼らはパラメータを受け取ります
    10'foo'__init__Pythonで使用されるクラス定義のほとんどを。

  • __del__(self)

    __new__そして、__init__オブジェクトコンストラクタである、__del__オブジェクトの破壊があります。それは声明を達成していないdel x(したがって、ステートメントが等しくありませんx.__del__())。オブジェクトがガベージ動作する場合しかし、それは定義されています。
    オブジェクトのような、便利なの破壊の時に何らかの処理を行う必要がある。この方法はsocket、オブジェクト、ファイルオブジェクト。しかし、それはオブジェクトがまだ生きている、ときPythonインタプリタが終了するときと指摘する__del__とされることはありません
    実行します。だから、手動クリーニングの良い習慣を開発する接続などタイムリー近くに、非常に重要です。

ここだ__init____del__例::

from os.path import join

class FileObject:
    '''文件对象的装饰类,用来保证文件被删除时能够正确关闭。'''

    def __init__(self, filepath='~', filename='sample.txt'):
        # 使用读写模式打开filepath中的filename文件
        self.file = open(join(filepath, filename), 'r+')

    def __del__(self):
        self.file.close()
        del self.file

クラス表現

__str__(self)

クラスのコールの定義の例str()ときの挙動。

__repr__(self)

クラスのコールの定義の例repr()ときの挙動。str()そして、repr()主な違いは、という点である「ターゲットオーディエンス。」repr()効果は、(ほとんどの場合、出力は有効なPythonコードであることができる)機械読み取り可能な出力を生成することであり、str()人間が読み取り可能な出力が生成されます。

__dir__(self)

クラスのコールの定義の例としてdir()挙動は、このメソッドは、呼び出し元に属性のリストを返す必要があります。一般的に、自分自身を達成する必要はありません__dir__あなたが再定義する場合でも、__getattr__または__getattribute__(次のセクションでは、説明します)、および対話型のクラスで使用する動的に生成された属性を用いても、この魔法の方法が不可欠です。

反射

あなたは、組み込み関数のマジック反映させるための方法を定義することによって制御することができますisinstanceし、issubclass行動を。ここでは魔法の対応方法:

  • __instancecheck__(self, instance)

    一つの例は、(例えば、クラスのインスタンスのあなたの定義するかどうかをチェックすることですisinstance(instance, class))。

  • __subclasscheck__(self, subclass)

    クラスはあなたが(例えばを定義するクラスのサブクラスであるかどうかを確認してくださいissubclass(subclass, class)

コンテキスト管理

使用して、オブジェクトときwith宣言は、コンテキストマネージャを作成したクラスは、いくつかのセットアップとクリーンアップを行うことができます。コンテキストマネージャは、マジックは、次の2つの方法で定義された機能します:

  • __enter__(self)

    使用して定義されてwith何をすべきかコンテキストマネージャの開始当初は、ステートメントブロックの宣言を作成します。ことに注意してください__enter__戻り値が割り当てられますwithです方針のステートメント、as後に何か。

  • __exit__(self, exception_type, exception_value, traceback)

    それは定義with(または終了)宣言ブロックを終えたときにコンテキストマネージャの動作を。ブロックの終了直後に行われるべきで、例外を処理するためにクリーンアップする、または他の作業を行うことができます。声明は、円滑な実施をブロックした場合exception_typeexception_valueおよびtracebackだろうNoneそうしないと、例外を処理したり、ユーザーが対処できるように選択することができます。

参考リンク

参考リンク2

参考リンク3

おすすめ

転載: www.cnblogs.com/ruhai/p/11134698.html