Python におけるインスタンス継承関係のオーバーロードの問題に関する簡単な説明
この記事では主に Python でのインスタンスの継承関係のオーバーロードの問題を紹介します。これには、必要な友人が参照できるように共有します
。構築メソッド isinstance(object, classinfo) は、オブジェクトが特定のクラスのインスタンスであるかどうかを判断できます。この関係は、直接的、間接的、または抽象的なものになります。
インスタンス チェックはオーバーロードが許可されています。ドキュメントのカスタマイズ インスタンスとサブクラス チェックを参照してください。 PEP 3119 の説明によると:
これが意味するのは、検出のために isinstance(x, C) を呼び出すときに、最初に C が存在するかどうかを確認するということです。 __instancecheck__ が存在する場合は、C.__instancecheck__(x) を呼び出します。返される結果はインスタンス検出の結果であり、デフォルトの判定方法はありません。
このメソッドはダックタイピングをチェックするのに役立ちます。コードでテストしました。
class Sizeable(object): def __instancecheck__(cls, instance): print("__instancecheck__ call") return hasattr(instance, "__len__") class B(object): pass b = B() print(isinstance(b, Sizeable)) # output:False
False のみが出力され、__instancecheck__ は呼び出されません。 これはどうなっているでしょうか。
実行中の__instancecheck__がありませんドキュメントが明確に記述されていないことがわかります。問題を見つけるために、isinstanceのソースコードからトレースを開始します。
[abstract.c] int PyObject_IsInstance(PyObject *inst, PyObject *cls) { _Py_IDENTIFIER(__instancecheck__); PyObject *checker; /* Quick test for an exact match */ if (Py_TYPE(inst) == (PyTypeObject *)cls) return 1; .... }
Py_TYPE(inst) == (PyTypeObject *)cls これは、 type(inst) is cls と同等の高速マッチング メソッドであり、この高速メソッドが正常に一致した場合、 Check __instancecheck__ には進みません。したがって、C.__instancecheck__ の存在に関するドキュメント内の優先順位チェックは間違っています。引き続きソース コードを見てください:
/* We know what type's __instancecheck__ does. */ if (PyType_CheckExact(cls)) { return recursive_isinstance(inst, cls); }
マクロ PyType_CheckExact:
[object.h] #define PyType_CheckExact(op) (Py_TYPE(op) == &PyType_Type)
を展開します。つまり、cls は type から直接構築されたクラスであり、その後、判定言語が確立されます。クラス宣言で指定されたメタクラスを除き、基本的には型によって直接構築されます。テストコードから判定が成立していることが分かりましたので、 recursive_isinstance と入力します。ただし、この関数には __instancecheck__ に関するコードは見つかりませんでした。 recursive_isinstance の判定ロジックは、大まかに言うと、 __mro__ の継承順序から
def recursive_isinstance(inst, cls): return pyType_IsSubtype(inst, cls) def pyType_IsSubtype(a, b): for mro in a.__mro__: if mro is b: return True return False
を判定するというものです。 PyObject_IsInstance 関数に戻って下を見てください:
if (PyTuple_Check(cls)) { ... }
これは、instance(x, C) の 2 番目のパラメーターがタプルであり、処理メソッドが PyObject_IsInstance(inst, item) を再帰的に呼び出すことである場合です。続きを読む:
checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__); if (checker != NULL) { res = PyObject_CallFunctionObjArgs(checker, inst, NULL); ok = PyObject_IsTrue(res); return ok; }
明らかに、ここで __instancecheck__ が取得されるのですが、この時点までのチェック プロセスを実行するには、定義されたクラスで metaclass を指定する必要があります。残っているのは、_PyObject_LookupSpecial を追跡することだけです:
[typeobject.c] PyObject * _PyObject_LookupSpecial(PyObject *self, _Py_Identifier *attrid) { PyObject *res; res = _PyType_LookupId(Py_TYPE(self), attrid); // 有回调的话处理回调 // ... return res; }
は Py_TYPE(self) を受け取ります。これは、指定されたメタクラスで __instancecheck__ を定義する必要があることを意味します。
概要 これまで、isinstance(x, C) の動作をオーバーロードするための条件をまとめました。
x オブジェクトは C によって直接インスタンス化できません。 __instancecheck__ は、指定されたメタクラス クラスで定義されています。
テストコード:
- ドキュメントは少し古い可能性があります。今回のテスト環境はPython3.6です。
class MetaSizeable(type): def __instancecheck__(cls, instance): print("__instancecheck__ call") return hasattr(instance, "__len__") class Sizeable(metaclass=MetaSizeable): pass class B(object): pass b = B() print(isinstance(b, Sizeable)) # output: False print(isinstance([], Sizeable)) # output: True
ログイン後にコピー - 関連する推奨事項: Python 2.7 pandas の read_excel の詳細な説明
以上がPython におけるインスタンス継承関係のオーバーロードの問題に関する簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









この記事では、MySQLデータベースの操作を紹介します。まず、MySQLWorkBenchやコマンドラインクライアントなど、MySQLクライアントをインストールする必要があります。 1. mysql-uroot-pコマンドを使用してサーバーに接続し、ルートアカウントパスワードでログインします。 2。CreatedAtaBaseを使用してデータベースを作成し、データベースを選択します。 3. createTableを使用してテーブルを作成し、フィールドとデータ型を定義します。 4. INSERTINTOを使用してデータを挿入し、データをクエリし、更新することでデータを更新し、削除してデータを削除します。これらの手順を習得することによってのみ、一般的な問題に対処することを学び、データベースのパフォーマンスを最適化することでMySQLを効率的に使用できます。

Phpoopでは、self ::は現在のクラスを指し、親::は親クラスを指し、静的::は後期静的結合に使用されます。 1.Self ::静的方法と一定の呼び出しに使用されますが、後期静的結合をサポートしていません。 2.Parent ::サブクラスには、親クラスのメソッドを呼び出すために使用され、プライベートメソッドにアクセスできません。 3.Static ::継承と多型に適した後期静的結合をサポートしますが、コードの読みやすさに影響を与える可能性があります。

羽毛の鍵は、その漸進的な性質を理解することです。 PS自体は、勾配曲線を直接制御するオプションを提供しませんが、複数の羽毛、マッチングマスク、および細かい選択により、半径と勾配の柔らかさを柔軟に調整して、自然な遷移効果を実現できます。

MySQLには、無料のコミュニティバージョンと有料エンタープライズバージョンがあります。コミュニティバージョンは無料で使用および変更できますが、サポートは制限されており、安定性要件が低く、技術的な能力が強いアプリケーションに適しています。 Enterprise Editionは、安定した信頼性の高い高性能データベースを必要とするアプリケーションに対する包括的な商業サポートを提供し、サポートの支払いを喜んでいます。バージョンを選択する際に考慮される要因には、アプリケーションの重要性、予算編成、技術スキルが含まれます。完璧なオプションはなく、最も適切なオプションのみであり、特定の状況に応じて慎重に選択する必要があります。

PSフェザーリングは、イメージエッジブラー効果であり、エッジエリアのピクセルの加重平均によって達成されます。羽の半径を設定すると、ぼやけの程度を制御でき、値が大きいほどぼやけます。半径の柔軟な調整は、画像とニーズに応じて効果を最適化できます。たとえば、キャラクターの写真を処理する際に詳細を維持するためにより小さな半径を使用し、より大きな半径を使用してアートを処理するときにかすんだ感覚を作成します。ただし、半径が大きすぎるとエッジの詳細を簡単に失う可能性があり、効果が小さすぎると明らかになりません。羽毛効果は画像解像度の影響を受け、画像の理解と効果の把握に従って調整する必要があります。

MySQLパフォーマンスの最適化は、インストール構成、インデックス作成、クエリの最適化、監視、チューニングの3つの側面から開始する必要があります。 1。インストール後、INNODB_BUFFER_POOL_SIZEパラメーターやclose query_cache_sizeなど、サーバーの構成に従ってmy.cnfファイルを調整する必要があります。 2。過度のインデックスを回避するための適切なインデックスを作成し、説明コマンドを使用して実行計画を分析するなど、クエリステートメントを最適化します。 3. MySQL独自の監視ツール(ShowProcessList、ShowStatus)を使用して、データベースの健康を監視し、定期的にデータベースをバックアップして整理します。これらの手順を継続的に最適化することによってのみ、MySQLデータベースのパフォーマンスを改善できます。

MySQLデータベースパフォーマンス最適化ガイドリソース集約型アプリケーションでは、MySQLデータベースが重要な役割を果たし、大規模なトランザクションの管理を担当しています。ただし、アプリケーションのスケールが拡大すると、データベースパフォーマンスのボトルネックが制約になることがよくあります。この記事では、一連の効果的なMySQLパフォーマンス最適化戦略を検討して、アプリケーションが高負荷の下で効率的で応答性の高いままであることを保証します。実際のケースを組み合わせて、インデックス作成、クエリ最適化、データベース設計、キャッシュなどの詳細な主要なテクノロジーを説明します。 1.データベースアーキテクチャの設計と最適化されたデータベースアーキテクチャは、MySQLパフォーマンスの最適化の基礎です。いくつかのコア原則は次のとおりです。適切なデータ型を選択し、ニーズを満たす最小のデータ型を選択すると、ストレージスペースを節約するだけでなく、データ処理速度を向上させることもできます。

Hash値として保存されているため、Navicatを介してMongoDBパスワードを直接表示することは不可能です。紛失したパスワードを取得する方法:1。パスワードのリセット。 2。構成ファイルを確認します(ハッシュ値が含まれる場合があります)。 3.コードを確認します(パスワードをハードコードできます)。
