gpt4 book ai didi

function - Python - 如何传递给类对象的函数参数类型(打字)

转载 作者:行者123 更新时间:2023-12-03 14:16:57 27 4
gpt4 key购买 nike

我想这是python 3.7(不确定)附带的,不仅可以将变量名传递给函数,还可以传递变量的类型。我想知道的是是否有可能传递特定类的类型。

你可以通过同样的方式:

def foo_func(i: int) -> None:
pass

如果我有一个类,让我们说:

class foo_class(object):
pass

我该如何改造 foo_func接收 foo_class而不是 int类型?

此外,如果 foo_class 是另一个类的继承,我可以从父类中强加一个更通用的类型吗?例如,如果我有,

class A(foo_class):
pass

class B(foo_class):
pass

我怎么可能通过 AB基于它的父级?

我的意思是这样的:

def foo_func(obj: foo_class_type) -> None:
pass

foo_func(A())
foo_func(B())

最佳答案

根据您是要传递类(类型)还是类的实例,您正在寻找 typing.Type或只是类(class)。

下面是一个简单的例子来解释这两种情况:

from typing import Type, TypeVar


class Vehicle:
def __init__(self):
print("Creating a %s" % self.__class__.__name__)

def move(self):
print("This %s is moving…" % self.__class__.__name__)

TVehicle = TypeVar("TVehicle", bound=Vehicle)

class Car(Vehicle):
def honk(self) -> None:
print("tuuuuut")

class Bike(Vehicle):
def ring(self) -> None:
print("ring")

class Dog:
def bark(self) -> None:
print("woof!")


def move(v: Vehicle) -> None:
v.move()

def instantiate(class_to_instantiate: Type[TVehicle]) -> TVehicle:
return class_to_instantiate() # create an instance

move(Bike())
move(Car())

instantiate(Bike).ring()
instantiate(Car).honk()
#instantiate(Dog)

CarBike继承自 Vehicle ,所以他们都至少得到了 move方法和自定义 __init__ ,它显示了调用它的类的名称。

现在,在第一个函数中, move ,一个人只是想指定参数 v应该是 Vehicle 的一个实例.该函数调用 Vehiclemove方法,它将显示发起调用的实例类的名称。

在第二个函数中, instantiate ,目标是创建一个类的实例。这通过 type variables 起作用,这允许您在此示例中指定函数的输入参数和输出参数之间存在关系:如果我要调用 instantiate(Bike) ,我希望返回类型是 Bike 的一个实例类,以便我可以合法地调用它的 ring方法。如果您要更换 TVehicle在这个函数定义中简单地由 Vehicle ,你的类型检查程序会报错,因为返回类型将是 Vehicle 的一个实例。类,您不能保证 ring方法存在。
最后, Type您在 instantiate 的参数中看到的部分只是允许您使用类调用函数,而不是使用该类的实例。这很有用,例如在您想延迟类的实例化的情况下。

请注意,这是一个解释如何执行此操作的示例。在更专业的环境中, Vehicle可能是 abstract base class并且这里的一些方法可以作为类方法给出。

关于您的代码示例的旁注:
  • 请注意,如果您不打算编写也适用于 Python2 的代码,则不应从 object 继承( ref )。
  • 类通常用 CapWord 编写名称,如 specified in PEP8 ,Python 风格指南。遵循这种风格会使您的代码更容易被其他开发人员理解。
  • 关于function - Python - 如何传递给类对象的函数参数类型(打字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55751368/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com