ホームページ >バックエンド開発 >Python チュートリアル >Python では、__subclasscheck__ と __subclasshook__ は 2 つの特別なメソッドです

Python では、__subclasscheck__ と __subclasshook__ は 2 つの特別なメソッドです

PHPz
PHPz転載
2023-09-14 12:37:022078ブラウズ

Python では、__subclasscheck__ と __subclasshook__ は 2 つの特別なメソッドです

Python は、広く適応可能で効果的なプログラミング言語であり、長年にわたって人気があります。 Python のオブジェクト指向機能により、継承やポリモーフィズムなどの高品質な機能の実装が可能になります。この記事では、Python でカスタム設計の継承チェックを可能にする、あまり知られていないが魅力的な 2 つのテクニック、subclasscheck と subclasshook について詳しく説明します。

サブクラスチェックとサブクラスフックとは何ですか?

Python では、組み込みの issubclass() 関数を使用して、クラスが別のクラスのサブクラスであるかどうかを判断することは珍しくありません。デフォルトでは、この関数は継承ツリーを調べてクラス間の接続を判断します。ただし、Python には、独自のメソッド subclasscheck および subclasshook を使用して、このデフォルトの動作をオーバーライドする方法も提供されています。

  • __subclasscheck__(cls) issubclass() 関数を使用してこの手法を呼び出し、クラスが他のすべてのクラスのサブクラスであるかどうかをテストします。デフォルトでは、通常の継承されたテストの結果を返しますが、オーバーライドしてこの動作を変更することができます。

  • __subclasshook__(cls) このメソッドを抽象基本クラス (ABC) で定義して、 issubclass() によって実行されるサブクラス チェックをカスタマイズできます。これは、ABC の subclasscheck のデフォルト実装によって呼び出されます。

サブクラスのフックメソッド

サブクラスフック メソッドがどのように機能するかを明確に理解するために、例を見てみましょう。 「Shape」という抽象基本クラスがあり、「area」と「perimeter」という 2 つの必須メソッドがあるとします。 「Shape」のサブクラスとみなされたいクラスは、これらのメソッドを実装する必要があります。

ステップ 1 2 つの具体的なメソッドを使用して、抽象基本クラス「Shape」、「Area」と「Perimeter」を決定します。

ステップ 2 指定されたメソッド「area」および「perimeter」を実装するカスタム クラス「Circle」を生成します。

ステップ 3 - 「Shape」クラスのサブクラスフック メソッドをオーバーライドして、クラスがサブクラスであるかどうかを判断するためのカスタム基準を指定します。この場合の基準は、クラスに「Area」メソッドと「Perimeter」メソッドが必要であることです。

ステップ 4 - issubclass() 関数を使用して、「Circle」が「Shape」のサブクラスであるかどうかをテストします。カスタム サブクラス フック メソッドを使用すると、「Circle」がカスタム条件を満たすため、結果は「True」になります。 #########例### 次に、これらのメソッドを実装するカスタム クラス「Circle」を作成しましょう -

リーリー

「Circle」クラスが必要なメソッドを実装している場合でも、issubclass() 関数は「Circle」が「Shape」のサブクラスであるかどうかをチェックするときに「False」を返します -

###出力### リーリー

ここで、サブクラスフック メソッドが登場します。 「Shape」クラスでこのメソッドをオーバーライドして、クラスがサブクラスであるかどうかを判断するためのカスタム基準を指定できます。 -

Example

リーリー

出力

「Circle」が「Shape」のサブクラスであるかどうかを確認すると、出力は次のようになります。

rree

サブクラスのチェック方法 場合によっては、サブクラスフックを使用する代わりに、サブクラスチェック メソッド自体をオーバーライドしたい場合があります。これにより、継承テストに最上級の詳細な制御を追加できます。これは例です

ステップ 1

サブクラス チェック メソッドをオーバーライドするカスタム基本クラス「CustomBase」を決定します。通常の継承接続をテストする代わりに、サブクラスに呼び出し可能な「magic_attribute」メソッドがあるかどうかをテストします。

ステップ 2

2 つのクラス「DerivedWithMagic」と「DerivedWithoutMagic」を生成します。前者には「magic_attribute」メソッドがありますが、後者にはありません。

第 3 步  利用 issubclass() 函数来测试“DerivedWithMagic”和“DerivedWithoutMagic”是否是“CustomBase”的子类。对于“DerivedWithMagic”,结论为“True”,因为它具有所需的“magic_attribute”方法;对于“DerivedWithoutMagic”,结论为“False”,因为它不再具有指定的方法。

示例
class CustomBase:
   def __subclasscheck__(self, subclass):
      return (hasattr(sub

class, "magic_attribute") and
callable(getattr(subclass, "magic_attribute")))
class DerivedWithMagic:
def magic_attribute(self):
pass
class DerivedWithoutMagic:
pass
print(issubclass(DerivedWithMagic, CustomBase))
print(issubclass(DerivedWithoutMagic, CustomBase))

输出

如果我们检查“Circle”是否是“Shape”的子类,则输出如下。

True
False

实际用例

虽然 Python 中的默认继承机制适用于大多数场景,但在某些情况下,使用 __subclasscheck__ 和 __subclasshook__ 自定义子类检查可能会有所帮助 -

  • **协议执行**  通过使用这些方法,您可以强制执行子类必须遵守的某些协议。在前面的实例中,我们决定任何被视为“Shape”子类的类都必须执行“area”和“perimeter”方法。

  • **混合课程**  Mixin 类的创建是为了向其他类提供特定的行为,但它们并不意味着用作独立的类。您可以使用 __subclasscheck__ 或 __subclasshook__ 定义自定义继承策略,通过利用 mixin 作为子类来识别类,尽管它们不会立即继承它。

  • **松散耦合**  在某些情况下,最大限度地减少软件系统中组件之间的依赖关系是有益的。通过使用 __subclasscheck__ 和 __subclasshook__,您可以在类之间建立关系,而无需创建严格的继承层次结构。

结论

Python 中的 __subclasscheck__ 和 __subclasshook__ 方法提供了一种强大的方法来自定义继承检查。当您想要强制执行子类关系的特定要求或提供更灵活的继承结构时,这些方法特别有用。通过理解和利用这些特殊方法,您可以创建适应性更强、更健壮的 Python 程序。

以上がPython では、__subclasscheck__ と __subclasshook__ は 2 つの特別なメソッドですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。