当前位置: 首页 > 知识库问答 >
问题:

类的类型提示可以在类函数中使用吗?[副本]

薛华容
2023-03-14

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

像这样的东西:

class Vector:
    def __add__(self, other: Vector):
        #blah blah

这当然行不通。是否有其他类似的方法或解决方法?

共有2个答案

赵刚豪
2023-03-14

您可以检查other是否为向量类型:

def __add__(self, other):
    if isinstance(other, Vector):
        ##do the add
    else:
        raise TypeError('other is not a Vector Type')
宰父保臣
2023-03-14

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

在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,然后让它在属性错误下失败:

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)

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

如果我误解了你的问题,它只是关于“如何添加打字提示”,那么你就把它包装成字符串(称为“向前引用”):

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

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

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

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

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 3.5项目中使用类型提示。我的函数应该接收一个函数作为参数。 如何在类型提示中指定类型函数? 我检查了PEP 483,但在那里找不到函数类型提示。 问题答案: 正如@jonrsharpe在评论中指出的,可以使用以下方法完成: 问题是,将其本身翻译为: 一个Callable接受 任意数量的/类型的 参数,并返回任何类型的值。在大多数情况下,这不是您想要的,因为您

  • 问题内容: class Node: def append_child(self, node: Node): if node != None: self.first_child = node self.child_nodes += [node] 我该怎么办?因为当我运行它时,它说。 我应该只删除and实例在函数中检查它吗?但是,我该如何访问的属性(我希望它是类的实例)? 我不知道如何在Python,

  • 问题内容: 我想允许使用Python 3进行类型提示,以接受某个类的子类。例如: 现在,当输入以下代码时: 我得到一个PyCharm IDE提示“期望的类型A,取而代之的是Type [B]。” 如何更改此处的类型提示以接受A的任何子类型? 据此(https://www.python.org/dev/peps/pep-0484/#type-definition- syntax ,“该类型的参数也接受

  • 我希望允许使用Python 3进行类型提示以接受某个类的子类。例如。: 现在当键入以下代码时: 我收到一个 PyCharm IDE 提示“预期的类型 A,而是获得类型 [B]。 如何在这里更改类型提示以接受? 根据PEP 484(“类型为特定参数类型的子类型的表达式也可用于该参数。”),我知道我的解决方案< code>(cls: A)应该可以工作?

  • 我最近开始使用数据类,它们将是3.7的一个很好的补充。我很好奇是否或如何使用数据类重新创建这个类的相同功能。 这不管用。引发异常 我假设这是因为类没有说明进行参数的解包。有什么方法可以指示数据类装饰器子菜单需要解包吗?

  • 我试图在Python3.5中使用类型提示。1,代码如下: 我猜在解析类型A时,类型A还没有完全构造,这是范围界定的问题,但我不理解为什么这样的语法不正确。是否有其他方式来表达它,或者它只是一个非法的构造? 我想在基类中使用这个语法提示,它可以在树状层次结构中组成派生类。