返回类的类方法

时间:2016-03-18 02:48:50

标签: python python-3.5 type-hinting

我正在玩python的3.5类型提示。我想知道如何键入提示类方法的返回类型。

这就是我的想法:

>>> class A():
    @classmethod
    def a(cls) -> A:
        pass

Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    class A():
  File "<pyshell#24>", line 3, in A
    def a(cls) -> A:
NameError: name 'A' is not defined

显然它不起作用。我想有一种方法是像这样做某种“前瞻性声明”:

>>> class A():
    pass

>>> class A():
    @classmethod
    def a(cls) -> A:
        pass

但这并不觉得“pythonic”。人们通常如何解决这个问题?

1 个答案:

答案 0 :(得分:11)

  

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

https://www.python.org/dev/peps/pep-0484/#forward-references

PEP文本继续提供以下示例:

tr2

除了提供字符串之外,您提出的解决方法存在问题 - 如果您这样做:

class Tree:
    def __init__(self, left: 'Tree', right: 'Tree'):
        self.left = left
        self.right = right

(final和real)class A(): pass class A(): @classmethod def a(cls) -> A: pass 中注释的返回值是在处理类主体时携带class A名称的对象 - 该对象是存根{{1} }。因此,任何在静态或运行时分析中检查A的返回值的工具都会发现它不等于类class A

所以,如果需要解决这个问题(我曾经需要它一次,我忘记了上下文 - 它与注释无关 - 啊 - 我现在回想起来:它是在一个自动生成Python ctypes的项目中特定C库的包装器,方法是创建一个单独的类,然后使用赋值语句扩充它。对于你的例子,那将是:

A.a()