3

如何在一个类中定义一个函数,使得函数的返回类型是“当前类”——而不是基类。例如:

Class Parent:
   def set_common_properties_from_string( input : str ) -> <WHAT SHOULD BE HERE>
     # Do some stuff you want to do in all classes
     return self

Class Child( Parent ):
   pass

   def from_file( filename : str ) -> 'Child'
      return Child().set_common_properties_from_string() # The return type of set_common must be Child

还是应该以某种方式施放它?如果返回类型是基类,那么它会报错。

我知道可以将它放到两行并添加临时变量来保存 Child(),但我认为单行看起来更好看。

我使用 mypy 进行类型检查。

4

1 回答 1

2

您可以使用新实现的(仍然是实验性的)通用 self功能,这是一种旨在帮助准确解决您遇到的问题的机制。

Mypy 从 0.4.6 版开始支持“通用自我”功能(注意:截至撰写本文时, mypy的最新版本是 0.470)。不幸的是,我不记得其他符合 PEP 484 的类型检查器是否支持此功能。

简而言之,您需要做的是创建一个新的 TypeVar,显式注释您的self变量以具有该类型,并将该 TypeVar 作为返回值。

因此,在您的情况下,您需要将代码修改为以下内容:

from typing import TypeVar

T = TypeVar('T', bound='Parent')

class Parent:
    def set_common_properties(self: T, input: str) -> T:
        # Do some stuff you want to do in all classes
        return self

class Child(Parent):
    def from_file(self, filename: str) -> 'Child':
        # More code here
        return Child().set_common_properties(...)

请注意,我们需要将 TypeVar 设置为受Parent类的限制——这样,在set_common_properties方法中,我们就可以调用存在于Parent.

您可以在 mypy 的网站和 PEP 484 中找到更多信息:

于 2017-02-26T05:15:09.630 回答