1.元类
#メタクラス: pythonで、すべてのオブジェクトクラスは、オブジェクトされている、クラスは...など、そのようなリストにストレージなどの通常のオブジェクトとして、または関数の引数として使用することができます オブジェクトクラスがインスタンス化されるので、生成され、クラスオブジェクトは、インスタンス化することによって製造さメタクラス(タイプ)である
メタクラス:クラスのクラスを生成するための手段 のクラスは3つの部分から構成 1 。クラスの名前 2 クラスのクラス父親 3 クラスの名前空間 私たちは、クラス取得するタイプ(クラス名、親クラスのタプルの名前空間辞書)メソッドを使用して、クラスを定義する際 のタイプ(クラス名、親クラスのタプルの名前空間辞書を) #は、新しいクラスを返す タイプ(オブジェクト) #は、オブジェクト・タイプが返される クラスのクラス定義を使用する場合、したがって、インタプリタ方式は、自動的に型のインスタンスを呼び出します
Execの Execは、実行することができ、彼らのpythonを満たすPythonコードの文字列を実行すると、あなたは実行の名前を指定することができるため、名前空間内に生成 class_text = 「」 " :クラスA テスト(自己)DEF: 印刷(セルフ) 「」 " loca2は = {} EXEC (class_text、なし、loca2) プリント(loca2) したがってExecはクラスのメソッドを取得する別の方法である evalの単純な式を実行するために、何か特別な構文を持つことができない、コードの一行
カスタムメタクラス: ======= #####メタクラスとして翻訳:それのメタクラス光景が、これはメタクラスで考えなければならない 、我々はクラス定義のメタにクラス名の後に読みメタクラスを簡単に追加しようとする アプリケーション: 私たちは、このようなクラス名の制限として、高度にカスタマイズカテゴリを、必要な時に資本で始めなければなりませんし、そうで... 唯一の新しいメタクラスを作成し、あなたがメタクラスを使用する必要がありますが、コード内のメタクラスタイプは変更できません(タイプから継承されます) `覆うことにより__init__ 制限完了するために、`クラスを クラス:MyMetaClass(タイプ) 通過 #が使用するカスタムメタクラスの クラスを人物(=メタクラスそのMyMetaClass): 合格
__init__メソッド クラスのオブジェクトがインスタンス化されるときに自動的に実行` __init__クラスのオブジェクトインスタンスを自動的に実行されたとき`メソッド、クラスは、オブジェクトでは`メタクラス__init__ `方法 三つのクラス、クラスに、必要なパラメータを名前、人の名前空間親クラス コースのは、自動的に最初のパラメータとして、クラスオブジェクト自体を通過する #1 #の場合:制限クラス名は大文字でなければならないコントロールクラスのメソッド名はすべて小文字でなければならない クラス(タイプの)MyMetaClass: DEF __init__ (セルフ、CLASS_NAME、塩基、name_dict): スーパー()__init__は(CLASS_NAMEは、塩基は、name_dict) #のクラス名は大文字または直接スローしなければならない のIF ない()class_name.istitle: 印刷(" クラス名は愚かなXを大文字にする必要があります!" ) 昇給の例外 #のコントロールクラスのメソッド名はすべて小文字でなければならない ためにK でname_dict: IF STR(タイプ(name_dict [K]))== " <クラス'関数'> " : IF ないk.islower(): 昇給の例外 パス #が自動的にメタクラスを渡す__init__メソッドを呼び出しますクラスオブジェクト自体親クラスのクラス名は、名前空間のある クラス:学生(オブジェクト、MyMetaClassを=メタクラス)#1 MyMetaClass( "学生"、(オブジェクト、)、{}) NAME = 10 DEF 言う(セルフ): 印刷(" SAY " ) 峠
__new__方法: クラス新しいメソッドは、クラス・オブジェクトが作成されるときに実行され、のinitメソッドの前にする アクションクラスのオブジェクトを作成することである クラス A(=メタクラスそのMyMetaClassを): パス 1 。MyMetaClass __new__を取得する方法を実行しますクラスオブジェクト 2 オブジェクトの実行MyMetaClass着信クラスの__init__方法、および他の特性、初期化。 注: 1 。呼び出しのカバー__new__特定のタイプが__new__必要がある場合、結果を返す コールで2.クラスオブジェクトの前にinitメソッドが作成されているので、高パフォーマンスの要件と問題がある場合は、その後、新しいカスタムの完了時に選択することができ、彼らはクラスオブジェクトを作成することはありません
__call__方法: メタクラスがインスタンス化されたクラスオブジェクトを呼び出すことによって実行されるコール、オブジェクトを作成するプロセスを制御するために使用することができる クラス(タイプの)MyMetaを: #は、クラスのインスタンスを取得 DEFの __call__(セルフ、*引数、* * kwargsから): 印刷(" コール" ) #のリターンスーパー()を呼び出し.__ __(* argsを、** kwargsから) new_args = [] のための I で引数: IF でisinstance(I、STR): new_args.append(i.upper( )) 他: new_args.append(I) のリターン。スーパー()__call__(new_args *、** kwargsから) #注注注:クラス・オブジェクト作成時__new__ __init__も行われる #は__call__クラス・オブジェクトがインスタンスを生成するときに実行 クラスの学生(メタクラス= :MyMeta) DEF __init__ (セルフ、名前、性別、年齢): self.name = 名 セルフ.gender = ジェンダー self.age = 年齢 S =学生(" ジャック"、" 女性"、18は) 印刷(s.age) 印刷(s.gender) クラスの人(=メタクラスそのMyMeta): DEF __init__ (セルフ、名前、性別): self.name= 名前 self.gender = ジェンダー P =人(" バラ"、" 男" ) 、印刷(p.name)
概要: コントロールを持つクラスを作成するプロセス** __ ** __init **使用して、プロセス制御オブジェクトの例__call__ も__call__の種類を呼び出す必要があり、その結果を返します** ** __new__ 最初の__init__に__new_に実行されます_タイプを呼び出し、__new__の結果を返す必要があります**
元クラスはシングルトンパターンを実装 :シングルトンは何 のオブジェクトのインスタンスが1つだけ存在する場合、クラス、クラスはシングルトンクラスになった 、単一の例の利点: すべての特性とクラスのオブジェクトの動作とまったく同じ、重複を避けるためにオブジェクト、資源の無駄を作成 する場合を: クラス(タイプの)SingletonMetaClass: #あなたが各クラスのクラスを作成するセットのinit OBJのため、この中Noneにプロパティのデフォルト実行します DEFの __init__ :(セルフ、A、B、C) 。スーパー()__init__を(B、C) self.obj = なし #はクラスオブジェクトを作成するときに方法を実行 DEF __call__(セルフ、引数*、** kwargsから): #は、このクラスのインスタンスを達成するために直接リターンを持っているかどうかを判定するシングルトン のIF self.obj: リターンself.obj #いいえ新しいインスタンスが作成され、クラスに保存されている OBJ =タイプ。__call__(自己、* argsを、** kwargsから) self.obj = OBJ 返す OBJを
2.異常
例外: 異常はプログラムの実行中に異常が起こると、発生時に間違ったシグナルである 、例外が適切に処理されない場合、それは、ユーザーエクスペリエンスが非常に悪いと、プログラムが終了することになります重大な結果につながることができ 、処理プログラムの目的は、異常な堅牢性向上のためにある 異常なカテゴリー: コードが実行される前に、Pythonインタプリタは、まず、コード実行の構文チェックを構文がチェックされますことから始めます 1つの異常を検出する構文:資格のプログラマーとしてこれを表示されません種低エラー 例外2.実行時間:構文チェックが経過したが、コードの実行を開始、動作異常の実行中に例外が発生すると呼ばれます
異常な一般的な例: TypeError例外は:「int型」オブジェクトは、IS ないの添字オブジェクトをスライスすることができません TypeError例外:「リスト」オブジェクトは、IS ないCallableオブジェクトを呼び出すことはできません はIndexError:リストインデックス境界外の範囲指数のうち、 例外TypeError:「builtin_function_or_method 」オブジェクトは、IS ない反復処理可能オブジェクトが反復することができません 。KeyError例外「XXX 」 このキーが存在しない FileNotFoundError:[errnoを 2]そのようなファイルまたはディレクトリ:「XXXXXを」 ファイルが見つかりません 珍しい構図: トレースバック(最新の結果ラストコール): ファイル「の.py F :. /日に11分の29の一般的な例外」、22行、で、<モジュール> オープン(と「XXXXX 」F AS): FileNotFoundErrorを: [エラー番号 2]このようなファイルまたはディレクトリ:「XXXXX 」 トレースバック異常なトラッキング情報の特定の位置のために、エラーを表示し、コール中に発生した 特定の符号誤りの機能のモジュールファイルのパス名の行番号を含む、起こる 最後の行の前にありますエラーの種類 主な参照がエラーを見つけることですエラーの背後にある詳細詳細例外処理を:
例外は、不正プログラムが終了する原因となる場合は、我々は異常避けるべきです発生した後
構文は: 試す: 内部試しに異常コードを表示されること を除き、eと例外の特定の種類: あなたは本当に異常を除いて実行した場合 、例外を処理するために: 1 。エラーはマカティが初めて特定してみてくださいスタンド障害の原因ではないとするとそれを解決 2. しようと、エラーが発生した理由をあなたは知っている、しかし、あなたは避けることができない場合でもにのみ 、たとえば、あなたが明示的にユーザーに正しいファイルパスを伝える必要があり、しかしユーザーはまだ間違ったパスを通過した パイプラインを使用する必要がありますが、一方の当事者が持っている場合、このようなソケットの側面として、あなたが知っている場合でも、閉鎖を余儀なく何らかの理由でそれが唯一のプログラムを確保しようとすることができるミスを避けることができない理由は、正常に終了 一言で言えば:しようと試みることなく、増やすことはできません
#:#カスタム例外クラスは、 システムが正確にエラーの原因を記述することはできません例外クラスを提供する場合、カスタム例外クラスのできる クラス MyException(例外): 合格 するExceptionから継承された 例外をスローするためのイニシアチブをとる: 我々は、機能プロバイダへの操作を行うと外の世界は、機能的なインターフェースを提供しますが、ユーザが機能を実行することができない場合、正常につながる、使用するための適切な方法、または不正なパラメータの種類やその他の理由に従っていない、彼らは例外をスローするためのイニシアチブを取る必要があります :キーワードの昇給の使用 任意の例外のキーワードをサブクラスやオブジェクト 昇給MyExceptionに 昇給の MyException(「エラー具体的な理由を!」)
アサートをアサート:
アサーションが実際に意味すると理解することができます結論
それは一定の条件が真である非常に間違いなく
、実際に設立された条件がかどうかを判断するために使用することができるかどうか
、その存在の目的が生まれるかどうかを判断簡素化することです