如何在Python中调用父类构造函数?

12 浏览
0 Comments

如何在Python中调用父类构造函数?

在我之前接触的所有其他语言中,超类的构造函数都会隐式调用。在Python中如何调用它呢?我原以为应该使用super(self),但这行不通。

0
0 Comments

在Python 2.x老式类中,可以通过以下方式调用超类的构造函数:

class A:
    def __init__(self):
        print "world"
class B(A):
    def __init__(self):
        print "hello"
        A.__init__(self)

这种方法在新式类中仍然有效,但使用新式类的一个原因之一就是不需要这样做。可以使用super而无需直接命名继承的类。

调用超类构造函数的原因是为了在子类中继承并扩展父类的行为。在上述代码中,类B继承自类A,并在其构造函数中调用了类A的构造函数。这样可以确保在实例化类B时,类A的构造函数也会被调用,从而执行类A中定义的操作。

解决方法是使用super函数来调用超类的构造函数。super函数可以自动识别当前类的直接父类,并调用父类的构造函数。这样可以避免直接命名父类,使代码更加灵活和可维护。

虽然在Python 2.x中可以使用super函数,但它在Python 3.x中更加推荐和常用。在Python 3.x中,所有的类都默认继承自object类,因此可以直接使用super函数来调用父类的构造函数。

总结起来,虽然在旧式类中可以通过直接命名父类来调用其构造函数,但在新式类中更推荐使用super函数来调用父类的构造函数。这样可以提高代码的灵活性和可维护性,并更好地利用Python的面向对象特性。

0
0 Comments

在Python中,我们可以使用super()来调用父类的构造函数。但是,为什么需要同时传递子类和当前实例作为参数呢?这是因为self可能实际上是B类的子类C的实例。

如果我们有B(A, AA)这样的多继承关系,super(B, self)将返回A类的实例,但如何获取AA类的实例呢?在这种情况下,如果selfB类的实例,那么super(B, self).__init__()将调用A类中定义的方法,super(A, self).__init__()将调用AA类中定义的方法。如果你编写的类可能会被多次继承,你应该始终包含对父类构造函数的调用,但具体调用哪个取决于子类的继承决策。

需要注意的是,Python 3中的super()使用不需要显式地传递子类和当前实例作为参数,可以直接写作super().__init__()。而在Python 2中仍然需要显式传递参数。

总结一下,super()可以在Python中调用父类的构造函数,通过传递子类和当前实例作为参数,我们可以在多继承的情况下正确地调用父类的构造函数。在Python 3中,可以直接使用super().__init__()来调用父类的构造函数,而在Python 2中需要显式传递参数。

以上是关于如何在Python中调用父类构造函数的问题的原因和解决方法的整理。希望对你有所帮助!

0
0 Comments

在Python中,调用超类方法(包括构造函数)有多种方法。然而,在Python 3中,这个过程已经被简化。在Python 3中,可以使用super()来调用超类的构造函数。

Python 3的示例代码如下:

class A(object):
    def __init__(self):
        print("world")
class B(A):
    def __init__(self):
        print("hello")
        super().__init__()

然而,在Python 2中,需要使用稍微冗长的super(<包含类名>, self)来调用超类的构造函数,这与super()等效。

Python 2的示例代码如下:

class A(object):
    def __init__(self):
        print "world"
class B(A):
    def __init__(self):
        print "hello"
        super(B, self).__init__()

原因:问题的出现是因为Python 3和Python 2在调用超类构造函数时的语法略有不同。在Python 3中,可以直接使用super()来调用超类的构造函数,而在Python 2中需要使用super(<包含类名>, self)

解决方法:要解决这个问题,可以根据代码所在的Python版本选择相应的调用语法。在Python 3中使用super(),在Python 2中使用super(<包含类名>, self)来调用超类的构造函数。这样可以确保代码在不同版本的Python中都能正确调用超类的构造函数。

0