1. isinstace&issubclass&タイプ
クラスA: パス クラスB(A): パス OBJ = B() プリント(でisinstance(OBJ、B)) プリント(でisinstance(OBJ、A))
A。でisinstance(A、B)
#は、タイプB(またはB派生クラス)がインスタンス化されたオブジェクトかどうかを決定 クラス:Aを 渡し 、クラスB(A)を: 合格 クラスC(B)が: 渡し 印刷(issubclass(B、A)) プリント(issubclass( C、A))
B。issubclass(a、b)は
#クラスはクラスB(またはb派生クラス)であるかどうかを判断し、派生クラスの #の思考:だからこれらのクラスとIterbleクラス等、関係リストのstrタプル辞書何ですか? コレクションをインポート反復処理可能プリント(でisinstance([1,2,3]、リスト)) #真印刷(でisinstance([1,2,3]、反復処理可能)) #真印刷(issubclass(リスト、反復処理可能)) #真#上記の例は、利用可能であり、データのこれらの種類は、反復することができ、リストSTRタプル辞書は、反復処理可能のすべてのサブクラスです。
現在のオブジェクトを取得:. Cタイプは、クラスによって作成されます
クラスはFoo(オブジェクト): 合格 OBJ = はFoo() 印刷(OBJ、タイプの(OBJ)) #は、現在のオブジェクトは、クラスによって作成されて取得します。 IFタイプ(OBJ)== はFoo: 印刷(" objがFooのです")
2.リフレクター
概念が最初に提案1982年スミスによって反射され、主にプログラムを指し、自身の状態や動作(イントロスペクション)を検出し、修正する機能にアクセスすることができます。それはすぐに反射コンピュータ科学の応用に関する研究につながった概念を前方に置きます。これは、最初のプログラミング言語設計の分野で使用された、とLispとオブジェクト指向の面で実績をあげています。
パイソンリフレクティブなオブジェクト指向型:文字列によって操作オブジェクトに関連するプロパティ。すべてが(リフレクションを使用することができる)Pythonでオブジェクトであります
4つのファンクションは、内省的な達成することができます
以下の方法は、クラスおよびオブジェクトに適用可能である(すべてが対象であり、クラス自体が目標です)
反射物体
クラスFooの: F = ' 静的クラス変数' DEF __init__ (セルフ、名前、年齢): self.name = 名前 self.age = 年齢 DEF say_hi(セルフ): 印刷(' こんにちは、S%'%self.name) OBJ =はFoo(' エゴン'、73がある) #それが財産含まれているかどうかを検出する 印刷(はhasattr(OBJ、' 名前' )) を印刷(はhasattr(OBJ、' say_hi ' )) #をプロパティを取得する N- = GETATTR(OBJ、' 名前' ) 印刷(N-) FUNC = GETATTR(OBJ、' say_hi ' ) FUNC() 印刷(GETATTR(OBJ、「AAAAAAAAは' ' ああは存在しません")) #のエラー #のセットプロパティ SETATTR(OBJ、' SB ' 、TRUE) SETATTR(OBJ、' SHOW_NAME '、ラムダ自己:self.name + ' SB ' ) を印刷(OBJ。__dict__ ) 印刷(obj.show_name(OBJ)) #は、属性が削除 (OBJ、delattr ' 年齢' ) delattr(OBJ、' SHOW_NAMEに' ) delattr(OBJ、' show_name111 ')#が存在しない場合、エラーの 印刷(OBJ。__dict__)
クラスのリフレクション
クラスFooの(オブジェクト): staticField = " オールドボーイ" デフ __init__ (自己): self.name = ' DISMAN ' DEF FUNC(自己): リターン ' FUNC ' @staticmethod DEF バー(): リターン ' バー' 印刷のgetattr(フー、' staticField ' ) 印刷 GETATTR(フー、' FUNC ' ) 印刷 GETATTR(フー、' バー')
反射し、現在のモジュール
インポートのSYS DEF S1(): 印刷 ' S1 ' DEF S2(): 印刷 'S2 ' this_module = sys.modules [ __name__ ] はhasattr(this_module、' S1 ' ) GETATTR(this_module、' S2 ')
他のモジュールの反射光
#コードモジュール DEF テスト(): 印刷(「テストからの」) 「」「 プログラムカテゴリ: module_test.py index.py 現在のファイル: index.py 」「」 #別のコードモジュール のインポートmodule_test AS OBJ #obj.test() 印刷(はhasattr(OBJ、' テスト' )) のgetattr(OBJ、' テスト')()
反射したアプリケーション
反射の4つの機能をご覧ください。そして、どのような使用エンドで反射がそれを何ですか?そのシナリオは、それがどのようなものですか?
それぞれ、今度は、ブラウザを開き、ウェブサイトを訪問してみましょう、あなたはログオンするためのログイン画面にジャンプする]をクリックし、あなたがそうでインターフェイスを登録するには登録ジャンプをクリックし、そして、実際にあなたが実際にいずれかのリンクをクリックしてくださいリンクに対処するための関数やメソッドを持つことになります。
反射を学ぶことがなかった以前のソリューション
クラスユーザ: DEF ログイン(セルフ): 印刷(「ログインページへようこそ」) DEF レジスタ(セルフ): 印刷(「登録ページへようこそ」) DEF 保存(セルフ): 印刷(「ストアページへようこそ」) しながら 1 : 選択し = INPUT(' >>> ' ).strip() IF選択== ' ログイン' : OBJ = ユーザー() obj.login() elifの ==選択し' 登録' : OBJ = ユーザー() obj.register() のelifを選択== ' 保存' : OBJ = ユーザー() )obj.save(
反射ソリューションを学んだ後
クラスユーザ: DEF ログイン(セルフ): 印刷(「ログインページへようこそ」) DEF レジスタ(セルフ): 印刷(「登録ページへようこそ」) DEF 保存(セルフ): 印刷(「ストアページへようこそ」) ユーザー = ユーザー() しばらく 1。 : 選択してください = INPUT(' >>> ' ).strip() IF はhasattr(ユーザー、選択してください): FUNC = GETATTR(ユーザー、選択) FUNC() 他: 印刷(' 入力エラー.... ')
これの利点は、反射明確に感じることができます
3.クラス/オブジェクト/関数/メソッドを分析する場合に呼び出すことができます
デフFUNC(): パス・ クラスはFoo(オブジェクト): デフ __call__(自己、* argsを、** kwargsから): 渡す デフFUNC(自己): 渡す OBJ = はFoo() プリント(呼び出し可能(FUNC)) プリント(呼び出し可能(フー)) プリント(呼び出し可能(OBJ)) プリント(呼び出し可能(obj.func))