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