Python 是 class 在同一 class 定义中的实例

Python isinstance of class within same class' definition

我想做类似的事情

class my_class:
    def __add__(self, other: "my_class") -> "my_class":
        if isinstance(other, some_other_class):
            return other + self
        elif isinstance(other, my_class):
            return <special_adding_technique>
        else:
            raise NotImplementedError()

但我不能,因为我无法在其内部引用 my_class。我可以使用 try except 或 check has_attr 做一些 duck typing,但这远不如简单地检查 isinstance 干净。我该怎么做既简单又不难看?

你可以在里面引用 my_class 就好了。您不能在 my_class 定义时引用它(在任何方法之外,在 class 定义范围的 top-level 处,或在函数的参数定义中),但您可以在完成定义 my_class 之前不会调用的方法中引用它。您在这里遇到的唯一问题是有点丑陋的 string-based 注释来解决 self-reference 限制,可以通过 __future__ 导入来修复。

from __future__ import annotations  # Supported as of 3.7, on by default beginning in 3.11

class my_class:
    def __add__(self, other: my_class) -> my_class:
        if isinstance(other, some_other_class):
            return other + self
        elif isinstance(other, my_class):
            return <special_adding_technique>
        return NotImplemented   # When you can't work with the other type, you're supposed
                                # to return the NotImplemented singleton, not raise
                                # NotImplementedError, where the latter is for completely
                                # unimplemented functionality, usually in an ABC

作为side-note,Python classes是lowercaselowercase_with_underscores的正常命名规则的例外; classes 使用 CapWords,所以这个 class 应该命名为 MyClass 以符合 PEP8。