可以在类函数中使用类的提示吗?

时间:2017-05-07 20:10:46

标签: python

是否可以在同一个类的类方法中使用类型注释? 假设我有一个vector类,这个类支持\Images\

这样的事情:

__add__

当然这不起作用。是否有其他类似的方法或任何变通方法?

1 个答案:

答案 0 :(得分:1)

类型注释旨在帮助人们阅读代码,静态分析工具和文档工具。即使可以执行代码(我的意思是没有NameError),它实际上也不执行任何操作。

在python中通常认为实际强制执行特定类的样式不好,通常需要特定的接口(比如具有特定的属性):

class Vector(object):
    def __init__(self, x, y):
        self.x, self.y = x, y
    def __add__(self, other):
        try:
            return Vector(self.x + other.x, self.y + other.y)
        except AttributeError:  # the other had no x or y attribute
            raise TypeError('cannot add Vector to {}'.format(type(other)))

或者只是省略tryexcept,然后让它失败并显示AttributeError

class Vector(object):
    def __init__(self, x, y):
        self.x, self.y = x, y
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

没有信息性异常消息(你需要一个吗?)但是当other没有xy属性时,它仍然会失败。

如果我误解了你的问题并且它只是关于“如何添加typehint”那么你只需将其包装为字符串(称为“前向引用”):

class Vector(object):
    def __add__(self, other: 'Vector'):
        ...

他们在PEP 484中甚至有类似的例子:

  

Forward references

     

当类型提示包含尚未定义的名称时,该定义可以表示为字符串文字,稍后要解决。

     

这种情况通常发生在容器类的定义中,其中定义的类出现在某些方法的签名中。例如,以下代码(简单二叉树实现的开始)不起作用:

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