Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.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_Abstract Class_Abc - Fatal编程技术网

Python 如何实现抽象基类的构造函数?

Python 如何实现抽象基类的构造函数?,python,python-3.x,inheritance,abstract-class,abc,Python,Python 3.x,Inheritance,Abstract Class,Abc,我正在尝试编写一个基本抽象类,该类具有一些属性,这些属性将使用构造函数初始化。到目前为止,我有: 从abc导入abc,abstractmethod A类(ABC): 定义初始化(self,n,*参数): self.n=n self.initialize_params(*params)#我想在 def初始化参数(自身,*参数) 通过 @抽象方法 def do(自我): 通过 B(A)类: 定义初始化(self,m,n,*超级参数): self.m=m super(A,self)。\uuuu ini

我正在尝试编写一个基本抽象类,该类具有一些属性,这些属性将使用构造函数初始化。到目前为止,我有:

从abc导入abc,abstractmethod
A类(ABC):
定义初始化(self,n,*参数):
self.n=n
self.initialize_params(*params)#我想在
def初始化参数(自身,*参数)
通过
@抽象方法
def do(自我):
通过
B(A)类:
定义初始化(self,m,n,*超级参数):
self.m=m
super(A,self)。\uuuu init\uuuu(n,*super\u参数)
def do(自我):
打印(“这是B”)

但是这将抛出
TypeError
,因为在B的
\uuuu init\uuuu
中实例化了A。这样做的正确方法是什么?

您似乎有几个错误:

从abc导入abc,abstractmethod
A类(ABC):
定义初始化(self,n,*参数):
self.n=n
self.initialize_params(*params)#我想在
def初始化参数(自身,*参数):
通过
@抽象方法
def do(自我):
通过
B(A)类:
定义初始化(self,m,n,*超级参数):
self.m=m
super()。uu init_uu(n,*super_参数)#使用super()调用init的正确方法
def do(自我):
打印(“这是B”)
b=b(1,2)
b、 do()

请注意,您错过了
self.
前面的
initialize_params()
,并且您似乎没有正确使用
super()

对于出现的错误,非常抱歉。我快速地输入了这个问题。我很好奇为什么这样调用
super
super(supercls,self)
不同。因为它只是同一调用IIRC的python3功能。@FarhoodET
super(supercls,self)
决不是您应该调用的
super
。它总是
super(调用它的类,self)。foo()
,尽管在Python 3中,您可以使用无参数形式
super().foo()
,这将相当于正确的版本。@juanpa.arrivillaga哦,您是对的!很抱歉给你带来了困惑。但是python中的多重继承呢?如何指示首先调用哪个超类初始值设定项?或者这不是问题?@FarhoodET如果你想调用一个特定的方法,你不会使用super,你只会使用specificclass.foo(self)。
super
的全部要点是委托给方法解析顺序中的下一个类。因此它需要
super(type,obj)
,其中
isinstance(obj,type)
。它以
type(obj)
的方法解析顺序跳过
type
。还有,@FarhoodET事实上,你为什么在
super
中传递
A
,这里:
super(A,self)
?您是否阅读了
super
的文档?