検索
ホームページバックエンド開発Python チュートリアルPython におけるインスタンス継承関係のオーバーロードの問題に関する簡単な説明

この記事では主に Python でのインスタンスの継承関係のオーバーロードの問題を紹介します。これには、必要な友人が参照できるように共有します

。構築メソッド isinstance(object, classinfo) は、オブジェクトが特定のクラスのインスタンスであるかどうかを判断できます。この関係は、直接的、間接的、または抽象的なものになります。
インスタンス チェックはオーバーロードが許可されています。ドキュメントのカスタマイズ インスタンスとサブクラス チェックを参照してください。 PEP 3119 の説明によると:

ここで提案されている主なメカニズムは、組み込み関数 isinstance() および issubclass() のオーバーロードを許可することです。オーバーロードは次のように機能します。呼び出し isinstance(x, C) は最初に次のことを確認します。 C. __instancecheck__ が存在し、存在する場合は、通常の実装ではなく C.__instancecheck__(x) を呼び出します。

これが意味するのは、検出のために 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__ は、指定されたメタクラス クラスで定義されています。

  1. テストコード:

  2. 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

  3. ドキュメントは少し古い可能性があります。今回のテスト環境はPython3.6です。
  4. 関連する推奨事項:

Python 2.7 pandas の read_excel の詳細な説明


以上がPython におけるインスタンス継承関係のオーバーロードの問題に関する簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Pythonを使用した科学コンピューティングでアレイはどのように使用されていますか?Pythonを使用した科学コンピューティングでアレイはどのように使用されていますか?Apr 25, 2025 am 12:28 AM

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

同じシステムで異なるPythonバージョンをどのように処理しますか?同じシステムで異なるPythonバージョンをどのように処理しますか?Apr 25, 2025 am 12:24 AM

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

標準のPythonアレイでnumpyアレイを使用することの利点は何ですか?標準のPythonアレイでnumpyアレイを使用することの利点は何ですか?Apr 25, 2025 am 12:21 AM

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

アレイの均質な性質はパフォーマンスにどのように影響しますか?アレイの均質な性質はパフォーマンスにどのように影響しますか?Apr 25, 2025 am 12:13 AM

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

実行可能なPythonスクリプトを作成するためのベストプラクティスは何ですか?実行可能なPythonスクリプトを作成するためのベストプラクティスは何ですか?Apr 25, 2025 am 12:11 AM

craftexecutablepythonscripts、次のようになります

numpyアレイは、アレイモジュールを使用して作成された配列とどのように異なりますか?numpyアレイは、アレイモジュールを使用して作成された配列とどのように異なりますか?Apr 24, 2025 pm 03:53 PM

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

Numpyアレイの使用は、Pythonで配列モジュール配列の使用と比較してどのように比較されますか?Numpyアレイの使用は、Pythonで配列モジュール配列の使用と比較してどのように比較されますか?Apr 24, 2025 pm 03:49 PM

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

CTypesモジュールは、Pythonの配列にどのように関連していますか?CTypesモジュールは、Pythonの配列にどのように関連していますか?Apr 24, 2025 pm 03:45 PM

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

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

SublimeText3 Mac版

SublimeText3 Mac版

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

SecLists

SecLists

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

SublimeText3 英語版

SublimeText3 英語版

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

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境