【发布时间】:2022-08-16 22:31:29
【问题描述】:
让我解释一下问题。我对类型提示很有经验(90% 或更多),但这对我来说很难——你能帮忙吗?
- 我创建了具有
children属性的基类,其类型为BaseClass。 - 我创建了继承
BaseClass的具体类,该类具有some_int额外属性。 - 问题是我的来自
BaseClass的类型提示返回set[\'BaseClass\'],所以孩子不能有额外的属性some_int。无论所有孩子都有some_int属性(都将是具体的类对象)。见代码:
from dataclasses import dataclass @dataclass class BaseClass: name: str children: set[\'BaseClass\'] def add_child(self, child: \'BaseClass\'): self.children.add(child) @dataclass class ConcreteClass(BaseClass): some_int: int def sum(self): # artificial to show problem accumulator = 0 for child in self.children: # type hint error! # some_int is not exists in BaseClass (what is true) accumulator += child.some_int如何在 Python 中正确表达?
-
您可以查看
if isinstance(child, ConcreteClass),然后添加。 -
建议与此问题无关。不需要检查类型,但需要编写正确的打字注释。
-
您是要表达
children: set[Self]还是ConcreteClass可以将BaseClass实例作为孩子?在前一种情况下,请参见 PEP673(自我类型)中的 this example,在后一种情况下 - 除了显式保护if isinstance()或assert或cast(此处不合适,IMO)外,别无他法。 -
不知道
Self能做什么,但BaseClassSelf应该是一样的,我认为它不能解决问题。我可能会读 PEP。请记住,鸭子类型是在 Python 中的——我不需要重写这个方法,因为它会起作用。我只需要重写输入:) -
鸭子打字意味着如果表现得像鸭子,我确实需要检查鸭子是否是鸭子。
标签: python python-typing