类型暗示具有耦合继承的列表

2024-10-01 00:26:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我将Python3.7.6与PyCharm一起使用。我希望我的代码可以作为一个很好的内部API来工作,并为对象显示代码完成,所以我希望使用类型

我正试图找到一个好的模式,用于:

  • 有两组类,每组都有自己的继承树
  • 一个组中的对象由另一个组中的对象列表组成

(下面的例子)

我在下面找到了一个方法,但感觉像是一个黑客。正确(或更好)的方法是什么

from typing import List, Type

class Leg:
    def step(self):
        print("step")

class DuckLeg(Leg):
    def paddle(self):
        print("splosh")

class Biped:
    def __init__(self, leg_type: Type[Leg]):
        self.legs: List[leg_type] = [leg_type(), leg_type()]

    def walk(self):
        for leg in self.legs:
            leg.step()

class Duck(Biped):
    def __init__(self):
        super().__init__(leg_type=DuckLeg)
        self.legs: List[DuckLeg] = self.legs  # A hack?

my_duck = Duck()
my_duck.walk()              # code-completion appears for .walk()
my_duck.legs[0].paddle()    # code-completion appears for .paddle()

编辑1:这个问题不是关于在哪里放置类型注释,而是如何确保代码完成在这种上下文中工作。如果以下行被注释掉

self.legs: List[DuckLeg] = self.legs

…由于duck键入,代码仍将运行,但.paile()的代码完成将不会出现,当手动输入PyCharm时,代码检查将报告:类“Leg”的未解析属性引用“paile”


Tags: 对象代码selfinitdeftypesteplist
1条回答
网友
1楼 · 发布于 2024-10-01 00:26:36

不确定这是否真的解决了你的问题,但我认为这比你的建议更干净:

from typing import List, Type

class Leg:
    def step(self):
        print("step")

class DuckLeg(Leg):
    def paddle(self):
        print("splosh")

class Biped:
    LegType = Leg
    def __init__(self):
        # self.LegType always gives the correct leg type for the instance
        self.legs: List[self.LegType] = [self.LegType(), self.LegType()]

    def walk(self):
        for leg in self.legs:
            leg.step()

class Duck(Biped):
    LegType = DuckLeg
    def __init__(self):
        super().__init__()

相关问题 更多 >