当我定义一个类时,如何在其方法的签名中包含必须属于同一类的参数?我正在构建一个应该像这样工作的图形结构,但这是一个简化的例子:
class Dummy:
def __init__(self, value: int, previous: Dummy=None):
self._value = value
self._previous = previous
@property
def value(self):
return self._value
def plus_previous(self):
return self.value + self._previous.value
d1 = Dummy(7)
d2 = Dummy(3, d1)
d2.plus_previous()
这会导致以下错误:
NameError: name 'Dummy' is not defined
我的意思是,我可以用Python 2的方式做到这一点,但我希望有一个比这更多的python-3-ic解决方案:
class Dummy:
def __init__(self, value: int, previous=None):
assert type(previous) is Dummy or previous is None
...
答案 0 :(得分:2)
虽然我同意,但这是一个相当丑陋的黑客,你也可以使用字符串作为类型提示:
class Dummy:
def __init__(self, value: int, previous: 'Dummy'=None):
self._value = value
self._previous = previous
@property
def value(self):
return self._value
def plus_previous(self):
return self.value + self._previous.value
如PEP-484中对类型提示所述:
当类型提示包含尚未定义的名称时,即 定义可以用表示为字符串文字,稍后要解决。
这种情况通常发生在a的定义中 容器类,其中定义的类出现在签名中 一些方法。例如,以下代码(开头的 一个简单的二叉树实现)不起作用:
class Tree: def __init__(self, left: Tree, right: Tree): self.left = left self.right = right
为了解决这个问题,我们写道:
class Tree: def __init__(self, left: 'Tree', right: 'Tree'): self.left = left self.right = right
字符串文字应包含有效的Python表达式(即,
compile(lit, '', 'eval')
应该是一个有效的代码对象),它应该 模块完全加载后评估没有错误。该 评估它的本地和全局命名空间应该是相同的 名称空间,其中同一函数的默认参数将是 评价。
这个hack的一个问题是,如果你在IDE 中进行重命名,那么IDE肯定不会考虑这些字符串文字,因此无法重命名这些。< / p>