类型接口

2024-03-28 11:58:37 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python3中键入“接口”的正确方法是什么

在以下示例中:

class One(object):
    def foo(self) -> int:
        return 42


class Two(object):
    def foo(self) -> int:
        return 142


def factory(a: str):
    if a == "one":
        return One()

    return Two()

键入factory函数返回值的正确方法是什么

它应该类似于“一个名为foo的单一方法的类型,它不接受任何参数并返回一个整数”

但我不知道该怎么做

UPD:这个问题专门用于打字


Tags: 方法self示例键入returnobjectfoofactory
2条回答

->在python中实际上没有什么作用

>>> def foo()->int:
...     return "yeet"
...
>>> foo()
'yeet'

与方法签名中的表示类型类似:

>>> def bar(a: int):
...     print(a)
...
>>> bar("yeet")
'yeet'

语法实际上只是一种注释代码的方法。从概念上讲,您可以通过在构造函数中引发异常来实现某种接口

>>> class foo:
...     def __init__(self):
...             raise()
...     def someFunc(self):
...             return(42)
...
>>> class bar(foo):
...     def __init__(self):
...             self.whatEver = "idk"
...
>>> a = bar()
>>> a.someFunc()
42
>>> baz = foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __init__
TypeError: exceptions must derive from BaseException

但是,由于python不是一种强类型的语言,您将无法获得所需的类型严格性的好处Edit: Python doesn't use static typing.

您可以使用typing.Union,但是,听起来您确实想要结构类型而不是名义类型Python supports this using ^{},它是python类型暗示系统支持的一部分,因此mypy将理解它,例如:

import typing

class Fooable(typing.Protocol):
    def foo(self) -> int:
        ...

class One(object):
    def foo(self) -> int:
        return 42


class Two(object):
    def foo(self) -> int:
        return 142


def factory(a: str) -> Fooable:
    if a == "one":
        return One()

    return Two()

x = factory('one')
x.foo()

注意,结构化类型非常适合Python的duck类型风格。Python的类型系统既支持结构形式,也支持名义形式

相关问题 更多 >