【问题标题】:Python - how to pass to a function argument type of a class object (typing)Python - 如何传递给类对象的函数参数类型(打字)
【发布时间】:2019-09-09 02:33:05
【问题描述】:

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

你可以通过同样的方式:

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

如果我有课让我们说:

class foo_class(object):
    pass

如何将foo_func 转换为接收foo_class 而不是inttype?

此外,如果 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())

【问题讨论】:

    标签: function class types arguments python-3.7


    【解决方案1】:

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

    这里有一个简单的例子来解释这两种情况:

    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),我希望返回类型是@987654339 的实例@class,这样我就可以合法地调用它的ring 方法。如果您只是用Vehicle 替换此函数定义中的TVehicle,您的类型检查程序会报错,因为返回类型将是Vehicle 类的一个实例,对此您没有保证ring 方法存在。 最后,您在instantiate 的参数中看到的Type 部分仅允许您使用类调用函数,而不是使用该类的实例。这很有用,例如在您想延迟类的实例化的情况下。

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

    您的代码示例的旁注:

    1. 请注意,如果您不打算编写也适用于 Python2 的代码,则不应从 object (ref) 继承。
    2. 类通常使用CapWord 名称编写,如specified in PEP8,Python 风格指南。遵循这种风格可以让其他开发人员更容易理解您的代码。

    【讨论】:

    • 而不是声明一个 TypeVar 并将其绑定到 Vehicle - Type[Vehicle] 也对我有用。
    猜你喜欢
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多