类型的方法签名参数(self)

时间:2017-06-20 10:22:34

标签: python python-3.x oop methods method-signature

当我定义一个类时,如何在其方法的签名中包含必须属于同一类的参数?我正在构建一个应该像这样工作的图形结构,但这是一个简化的例子:

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
        ...

1 个答案:

答案 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>