在python中有时候需要对类进行重写,可以重写一般方法也可以重写构造方法,构造方法是用来初始化新创建对象的状态。
1 2 3 4 5
| class A(object): def hello(self): print('Hello, i am A.') class B(A): pass
|
1 2 3 4 5 6
| >>>a = A() >>>b = B() >>>a.hello() Hello, i am A. >>>b.hello() Hello, i am A.
|
因为B类没有定义自己的hello方法,故当hello被调用时,原始信息就被打印出来了。
B类也可以重写这个hello方法。
1 2 3
| class B(A): def hello(self): print('Hello', i am B)
|
1 2 3
| >>>b = B() >>>b.hello() Hello,i am B.
|
以上就是重写的一般方法。
如果特殊的构造方法被重写,将会导致原始父类的方法无法被调用。
1 2 3 4 5 6 7 8 9
| class Bird: def __init__(self): self.htngry = True def eat(self): if self.hungry: print('Aaaah...') self.hungry = False else: print('No,thanks!')
|
1 2 3 4 5
| >>>b = Bird() >>>b.eat() Aaaah... >>>b.eat() No,thanks!
|
现在为子类SongBird
1 2 3 4 5
| class SongBird(Bird): def __init__(self): self.sound = 'Squawk!' def sing(self): print('self.sound')
|
1 2 3 4 5
| >>>s = SongBird() >>>s.sing() Squawk! >>>s.eat() AttributeError: SongBird instance has no attribute 'hungry'
|
报错,提示SongBird没有hungry特性。
有两种方法可以解决这个问题:
- 调用未绑定的父类构造方法
1 2 3 4 5 6
| class SongBird(Bird): def __init__(self): Bird.__init__(self): self.sound = 'Squawk!' def sing(self): print('self.sound')
|
只添加一行代码Bird.__init__(self)
1 2 3 4 5 6 7
| >>>s = SongBird() >>>s.sing() Squawk! >>>s.eat() Aaaah... >>>s.eat() No.thanks!
|
- 使用
super
函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print('Aaaah...') self.hungry = False else: print('No,thanks!') class SongBird(Bird): def __init__(self): Super(SongBird,self).__init__() self.sound = 'Squawk!' def sing(self): print('self.sound')
|
1 2 3 4 5 6 7
| >>>s = SongBird() >>>s.sing() Squawk! >>>s.eat() Aaaah... >>>s.eat() No.thanks!
|