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是lowercase
或lowercase_with_underscores
的正常命名规则的例外; classes 使用 CapWords
,所以这个 class 应该命名为 MyClass
以符合 PEP8。
我想做类似的事情
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是lowercase
或lowercase_with_underscores
的正常命名规则的例外; classes 使用 CapWords
,所以这个 class 应该命名为 MyClass
以符合 PEP8。