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

问题描述 投票:0回答:1

我正在将Python 3.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

...由于执行鸭式输入,代码仍将运行,但.paddle()不会显示代码完成,并且当手动输入PyCharm代码时,检查报告将报告:类'Leg'的未解析属性引用'paddle'。] >

我正在将Python 3.7.6与PyCharm结合使用。我希望我的代码能够作为一个不错的内部API来工作,并为对象显示代码完成功能,因此我想使用类型输入。我正在尝试为以下情况找到一个好的模式:...

python inheritance typing
1个回答
0
投票

不确定这是否能真正解决您的问题,但我认为它比您的建议还干净:

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