この記事では主に 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__ は、指定されたメタクラス クラスで定義されています。
テストコード:
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
ドキュメントは少し古い可能性があります。今回のテスト環境はPython3.6です。 - 関連する推奨事項:
以上がPython におけるインスタンス継承関係のオーバーロードの問題に関する簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

Arraysinpython、特にvianumpy、arecrucialinscientificComputing fortheirefficienty andversitility.1)彼らは、fornumericaloperations、data analysis、andmachinelearning.2)numpy'simplementation incensuresfasteroperationsthanpasteroperations.3)arayableminablecickick

Pyenv、Venv、およびAnacondaを使用して、さまざまなPythonバージョンを管理できます。 1)Pyenvを使用して、複数のPythonバージョンを管理します。Pyenvをインストールし、グローバルバージョンとローカルバージョンを設定します。 2)VENVを使用して仮想環境を作成して、プロジェクトの依存関係を分離します。 3)Anacondaを使用して、データサイエンスプロジェクトでPythonバージョンを管理します。 4)システムレベルのタスク用にシステムPythonを保持します。これらのツールと戦略を通じて、Pythonのさまざまなバージョンを効果的に管理して、プロジェクトのスムーズな実行を確保できます。

numpyarrayshaveveraladvantages-averstandardpythonarrays:1)thealmuchfasterduetocベースのインプレンテーション、2)アレモレメモリ効率、特にlargedatasets、および3)それらは、拡散化された、構造化された形成術科療法、

パフォーマンスに対する配列の均一性の影響は二重です。1)均一性により、コンパイラはメモリアクセスを最適化し、パフォーマンスを改善できます。 2)しかし、タイプの多様性を制限し、それが非効率につながる可能性があります。要するに、適切なデータ構造を選択することが重要です。

craftexecutablepythonscripts、次のようになります

numpyarraysarasarebetterfornumeroperations andmulti-dimensionaldata、whilethearraymoduleissuitable forbasic、1)numpyexcelsinperformance and forlargedatasentassandcomplexoperations.2)thearraymuremememory-effictientivearientfa

NumPyArraySareBetterforHeavyNumericalComputing、whilethearrayarayismoreSuitableformemory-constrainedprojectswithsimpledatatypes.1)numpyarraysofferarays andatiledance andpeperancedatasandatassandcomplexoperations.2)thearraymoduleisuleiseightweightandmemememe-ef

ctypesallowsinging andmanipulatingc-stylearraysinpython.1)usectypestointerfacewithclibrariesforperformance.2)createc-stylearraysfornumericalcomputations.3)passarraystocfunctions foreffientientoperations.how、how、becuutiousmorymanagemation、performanceo


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

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

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

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

ホットトピック









