Python:如何覆盖子类中实例属性的类型提示?

问题描述 投票:3回答:2

在开始研究之前,这是我的问题:如何在子类中使用类型提示在实例属性上指定其他类型?

如果您不清楚这是什么意思,请阅读下面的内容,我在其中草拟了一个示例以澄清问题。


完整说明

我有一个抽象类Foo和一个名为Foo的子类SubclassOfFoo

[Foo具有抽象方法get_something,该方法返回类型为Something的对象。

Something具有一个称为SubclassOfSomething的子类。 SubclassOfSomething有另一种方法something_special

SubclassOfFoo覆盖get_something以返回类型为SubclassOfSomething的对象。然后,SubclassOfFoo尝试使用SubclassOfSomething的方法something_special

但是,目前我的PyCharm的检查报告为Unresolved attribute reference 'something_special' for class 'Something'。我正在尝试找出解决此问题的正确方法。

这都非常令人困惑,因此我制作了一个不错的小代码段来帮助您:


from abc import ABC, abstractmethod


class Something:
    def __init__(self):
        self.attr = 0


class SubclassOfSomething(Something):
    def __init__(self):
        Something.__init__(self)

    def something_special(self):
        self.attr = 1


class Foo(ABC):
    def __init__(self):
        self.my_class = self.get_something()

    @abstractmethod
    def get_something(self) -> Something:
        pass


class SubclassOfFoo(Foo):
    def __init__(self):
        Foo.__init__(self)

    def get_something(self) -> SubclassOfSomething:
        return SubclassOfSomething()

    def do_something_special(self):
        self.my_class.something_special()

基本上,为了使所有事情都能解决,我可以做几件事之一:

  1. 删除get_somethingFoo返回的类型提示
  2. SubclassOfFoo中使用类型提示来为self.my_class清除内容>>
  3. 使用泛型?
  4. 选项#1是我要避免的选项

选项2不错,但我无法弄清楚

选项3也是一个选项。

我也愿意接受其他选择,因为我确定有更好的方法。

您能帮我找出解决此问题的正确方法吗?


我尝试过的事情

为了模拟选项#2,我尝试按照此处的建议使用typing.TypeSubclass in type hinting

但是,这对我不起作用。

在开始学习之前,这是我的问题:如何在子类中使用类型提示在实例属性上指定其他类型?如果您不清楚这是什么意思,请在下面阅读我的位置...

python pycharm subclass type-hinting typing
2个回答
0
投票

您也可以在something_special上提供Something方法,并提出NotImplementedError


0
投票

您可以在类定义的开头为my_class属性提供类型提示:

© www.soinside.com 2019 - 2024. All rights reserved.