super(A,self).__init__()可以确保调用的是 A类的父类构造函数。而super().__init_()没有显式地指定当前类和实例,它会自动从调用处的上下文中推断。单次继承没什么区别。主要是多继承的时候有区别,可以指定继承谁。
super(A, self).__init__()和super().__init__()是两种使用super()函数的不同方式。super(A, self).__init__()是在Python 2.x和Python 3.x之前的旧式类(classic class)中使用super()函数的语法。在旧式类中,super()函数需要传递当前类的名字(A)和实例(self)作为参数,以指定要调用的超类的方法。这样做是因为旧式类不使用统一的方法解析顺序(MRO)算法来决定方法调用的顺序。而super().__init__()是在Python 3.x中使用super()函数的新式类(new-style class)中的语法。在新式类中,super()函数不需要显式地传递类名和实例作为参数,它会自动获取当前类和实例的信息。这是因为新式类使用了基于方法解析顺序(MRO)的多继承算法,可以更好地处理方法调用的顺序。所以,如果你正在使用Python 2.x或旧式类,你需要使用super(A, self).__init__()来调用超类的构造函数。而如果你正在使用Python 3.x或新式类,你可以简化为super().__init__()。关于“基于方法解析顺序(MRO)的多继承算法,可以指定 super 只使用某个父类的方法吗?”:在使用super()函数时,无法直接指定只使用某个特定父类的方法。super()函数的作用是根据方法解析顺序(MRO)找到下一个继承链中的类,并调用该类中的对应方法。方法解析顺序是一个算法,用于确定多继承中方法的查找顺序。它基于广度优先搜索(BFS)算法,并遵循特定的规则来决定方法的调用顺序。根据MRO算法,super()函数会按照MRO顺序找到下一个类,并调用该类的方法。如果你希望只调用特定父类的方法,而不是按照MRO顺序进行调用,那么你可以直接调用该父类的方法,而不使用super()函数。你可以通过在实例中使用父类的类名来调用该父类的方法,例如ParentClass.method(self)。另外,如果你想要更精确地控制方法调用顺序,你可以手动编写代码来调用特定父类的方法,而不依赖于super()函数。这样可以绕过MRO算法,但需要小心处理多继承可能引发的命名冲突和逻辑问题。总之,super()函数的作用是自动根据MRO顺序调用下一个继承链中的类的方法,而无法直接指定只使用某个特定父类的方法。
super(A,self).__init__()
可以确保调用的是 A类的父类构造函数。而
super().__init_()
没有显式地指定当前类和实例,它会自动从调用处的上下文中推断。单次继承没什么区别。主要是多继承的时候有区别,可以指定继承谁。