gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:25:08 26 4
gpt4 key购买 nike

在您深入之前,我的问题是:如何在子类中使用类型提示来指定实例属性的不同类型?

如果您不清楚这意味着什么,请阅读下文,我在其中制定了一个示例来澄清事情。


完整解释

我有一个抽象类 FooFoo 的子类 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. 移除 Fooget_something 返回的类型提示
  2. SubclassOfFoo 中为 self.my_class 使用类型提示来清除问题
  3. 使用泛型?

选项 1. 是我要避免的

选项2.不错,但我想不通

选项 3. 也是一个选项。

我也对其他选择持开放态度,因为我确信有更好的方法。

你能帮我想出正确的处理方法吗?


我尝试过的

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

但是,这对我不起作用。

最佳答案

使用泛型:

from abc import ABC, abstractmethod
from typing import Generic, TypeVar


SomethingT = TypeVar('SomethingT', bound='Something')


...


class Foo(ABC, Generic[SomethingT]):
my_class: SomethingT

def __init__(self):
self.my_class = self.get_something()

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


class SubclassOfFoo(Foo[SubclassOfSomething]):
def __init__(self):
super().__init__()

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

def do_something_special(self):
# inferred type of `self.my_class` will be `SubclassOfSomething`
self.my_class.something_special()

关于Python:如何覆盖子类中实例属性的类型提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58089300/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com