python类的重写

        在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. 调用未绑定的父类构造方法
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!
  1. 使用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!