是否可以在同一个类的类方法中使用类型注释?
假设我有一个vector类,这个类支持\Images\
。
这样的事情:
__add__
当然这不起作用。是否有其他类似的方法或任何变通方法?
答案 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)))
或者只是省略try
和except
,然后让它失败并显示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
没有x
或y
属性时,它仍然会失败。
如果我误解了你的问题并且它只是关于“如何添加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