コンストラクタ
私たちの最も基本的な魔法の方法が知られている__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_type
、exception_value
およびtraceback
だろうNone
。そうしないと、例外を処理したり、ユーザーが対処できるように選択することができます。