首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >输入具有耦合继承的列表

输入具有耦合继承的列表
EN

Stack Overflow用户
提问于 2020-03-02 13:07:57
回答 1查看 262关注 0票数 1

我在PyCharm中使用Python3.7.6。我希望我的代码作为一个很好的内部API工作,代码完成会出现在对象上,所以我想使用类型。

我试着找出一个很好的模式:

  • 有两组类,每个组都有自己的继承树
  • ,来自一个组的对象由来自其他组

的对象列表组成

(例子如下)

我在下面找到了一条路,但感觉就像一次黑客攻击。做这件事的正确(或更好)方法是什么?

代码语言:javascript
复制
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:这个问题不是放在哪里的类型注释,而是如何确保代码完成工作在这种情况下。如果下面的行被注释掉.

代码语言:javascript
复制
self.legs: List[DuckLeg] = self.legs

...the代码仍然会因为鸭子类型而运行,但是.paddle()不会出现代码完成,当手动输入PyCharm代码时,代码检查将报告:未解决的属性引用“paddle”,用于类'Leg‘。

EN

回答 1

Stack Overflow用户

发布于 2020-03-02 14:15:28

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

代码语言:javascript
复制
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__()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60489538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档