我在PyCharm中使用Python3.7.6。我希望我的代码作为一个很好的内部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...the代码仍然会因为鸭子类型而运行,但是.paddle()不会出现代码完成,当手动输入PyCharm代码时,代码检查将报告:未解决的属性引用“paddle”,用于类'Leg‘。
发布于 2020-03-02 14:15:28
不确定这是否真的解决了你的问题,但我认为它比你建议的要干净:
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__()https://stackoverflow.com/questions/60489538
复制相似问题