Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python类型中,如何指示参数应该是对派生类的引用?_Python_Python 3.x_Inheritance_Typing - Fatal编程技术网

在python类型中,如何指示参数应该是对派生类的引用?

在python类型中,如何指示参数应该是对派生类的引用?,python,python-3.x,inheritance,typing,Python,Python 3.x,Inheritance,Typing,我希望将类本身作为构造函数中的参数传递。我知道这在Python中是可能的,但我在理解如何编写正确的类型注释时遇到了问题。用例如下所示: 在类A的构造函数中,我想传递一个对在BaseX之后继承的某个类X(不是类X的对象)的引用。X和BaseX都来自一个库。除了对X的引用之外,A的构造函数还接受有助于构建X的参数: #库 BaseX类: def func(): 打印(“Hey BaseX”) X类(BaseX): def func(): 打印(“X!”) #我的客户代码 A类: def uu ini

我希望将类本身作为构造函数中的参数传递。我知道这在Python中是可能的,但我在理解如何编写正确的类型注释时遇到了问题。用例如下所示:

在类
A
的构造函数中,我想传递一个对在
BaseX
之后继承的某个类
X
(不是类
X
的对象)的引用。
X
BaseX
都来自一个库。除了对
X
的引用之外,
A
的构造函数还接受有助于构建
X
的参数:

#库
BaseX类:
def func():
打印(“Hey BaseX”)
X类(BaseX):
def func():
打印(“X!”)
#我的客户代码
A类:
def uu init uu(arg x,arg y,layer:BaseX):#layer的注释应该是什么?
#构造BaseX对象
self.layer=BaseX(x=x,y=y)#IDE将x和y显示为意外参数,因为它们将BaseX视为一个对象并查看其_调用_函数
A(5,6,X)
我不确定如何表达层的注释,以便将其视为一个类,并确保其为
BaseX
的派生。我还想问一些关于这是否是一种蟒蛇式的方法的评论


干杯

您可以使用注释
type[BaseX]
指示变量是对类型的引用(请参阅)。用
Type[T]
注释的变量保存属于
T
子类型的任何类型

对于“构造指定类型的对象(它是
BaseX
的子类型)”的特定用例,您可以在的帮助下使用更精确的注释。例如:

T=TypeVar('T',bound=BaseX)
def构造(cls:Type[T],*args,**kwargs)->T:
返回cls(*args,**kwargs)
在这里:

  • TypeVar('T',bound=BaseX)
    定义了一个“类型变量”,可以用
    BaseX
    定义的任何类型“bounded”替换,即是
    BaseX
    的子类型
  • construct
    函数接受一个带有注释的参数
    cls
    ,表示它是对
    BaseX
    的子类型的引用
  • 返回类型注释为
    T
    ,表示返回值是
    BaseX
    子类型的实例
  • 函数或类中所有出现的类型变量都绑定到同一类型。在本例中,返回值的类型是作为参数传递的类型

直接使用类本身看起来不错,但您可能无法调用由键入模块提供的注释。例如,Callable[BaseX]@Buğraİgüzar Callable接受参数和结果类型。此外,如果我没有错的话,不是每个类都必须是函子。我不知道它有什么帮助。你能详细说明一下吗?