Python 相当于 Java 括号显式类型转换

Python equivalent for Java parenthesis explicit typecast

我遇到了这样的并行继承情况:

class FruitColor:
    # general colors
    def __init__(self, name):
        self.name = name

class Fruit:
    def __init__(self, color:FruitColor):
        self.color:FruitColor = color

class CitrusColor(Color):
    # specialized colors
    def __init__(self, name):
        super.__init__(name)
    
    def be_citrus(self):
        print('i am a citrus color')

class CitrusFruit(Fruit):
    def __init__(self, color:CitrusColor):
        super().__init__(color)

稍后在我的程序中,我会做这样的事情:

orange:CitrusFruit = CitrusFruit(CitrusColor('bloodorange'))

orange.color.be_citrus()

我相信这应该可以正常执行,因为 orange.color 是一个 CitrusColor 实例,尽管我在超构造函数中输入提示它是一个 FruitColor

然而,我的 IDE 抱怨 be_citrus 不是 FruitColor 的成员。有没有办法像我在 Java?

中那样显式地类型转换为子类
((CitrusColor) orange.color).be_citrus()

是,使用typing.cast:

from typing import cast

cast(CitrusColor, orange.color).be_citrus()

给阅读本文的人的注意事项,这当然 在 运行 时间 什么都不做,这只是告诉任何第三方工具,如 mypy出于静态类型检查的目的,orange.color 的结果可以被认为是 CitrusColor它已经在 运行 时间)。

您的程序将运行 以完全相同的方式有或没有它。