Python中的重写构造方法

重写构造方法

当子类重写了超类(父类)的构造方法时,就需要调用超类的构造方法,否则子类对象可能不会被正确地初始化。
当调用超类的构造方法时,有两种方式。
①调用未绑定的超类的构造方法
②使用super函数

一个简单示例:子类重写了超类的构造方法,导致子类调用超类中的方法报错

class Animal(object):
    def __init__(self):
        print("This is Aniaml")
        self.feet = 0
    def countfeet(self):
        print(self.feet)

class Spider(Animal):
    def __init__(self):
        print("This is Spider")

test = Spider()
test.countfeet()

报错

AttributeError: 'spider' object has no attribute 'feet'

调用未绑定的超类的构造方法

class Animal(object):
    def __init__(self):
        print("This is Aniaml")
        self.feet = 0
    def countfeet(self):
        print(self.feet)

class Spider(Animal):
    def __init__(self):
        Animal.__init__(self)
        print("This is Spider")
        self.feet=4

test = Spider()
test.countfeet()

运行结果

This is Aniaml
This is Spider
4

绑定方法和未绑定方法

绑定方法:在调用实例的方法时,该方法的self参数会被自动绑定到实例上,也就是说当前实例就作为self参数。这种方法就是绑定方法

未绑定方法:直接调用类的方法如上Animal.__init__()方法,那就会没有实例会被绑定。这样可以自由地提供需要的self参数。这种方法就叫做未绑定方法。
上面示例中,使用未绑定方法,将Spider实例作为Animal构造方法中的self参数,使得Spider能够使用超类构造方法中的所有设定。

使用super函数

class spider(animal):
    def __init__(self):
        super(spider, self).__init__()
        print("This is Spider")
        self.feet = 4

super函数返回了一个super对象,这个对象负责对方法进行解析,当对其特性进行访问时,它会查找所有的超类(以及超类的超类),知道找到所需的特性为止(或者引发一个AttributeError异常)

两种方法的区别

在单继承时,调用未绑定的超类的构造方法和使用super继承效果是一样的。但现在都是推荐使用super继承。
当类属于多重继承时,使用第一种方法,会使超类被重复调用,而super继承可以使超类只被调用一次。
这里需要说明super继承只能用于新式类,用于经典类时就会报错,并且类的继承方式要一致,不要第一种方法和第二种方法混用。

class A(object):
    def __init__(self):
        print("This A...")


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


class C(A):
    def __init__(self):
        A.__init__(self)
        print("This C...")


class D(B, C):
    def __init__(self):
        C.__init__(self)
        B.__init__(self)
        print("This is D...")

test = D()

运行结果

This A...
This C...
This A...
This B...
This is D...

当使用super函数时

class A(object):
    def __init__(self):
        print("This A...")


class B(A):
    def __init__(self):
        super(B, self).__init__()
        print("This B...")


class C(A):
    def __init__(self):
        super(C, self).__init__()
        print("This C...")


class D(B, C):
    def __init__(self):
        super(D, self).__init__()
        print("This is D...")


test = D()

运行结果

This A...
This C...
This B...
This is D...

猜你喜欢

转载自blog.csdn.net/renzhadebenyuan/article/details/80205144