什么是继承
继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。继承是实现代码的复用,相同的代码不需要重复的写。
class Animal:
def eat(self):
print('吃...')
def drink(self):
print('喝...')
class Cat(Animal):
def call(self):
print('喵喵~')
kitty=Cat()
kitty.eat()###直接继承父类
kitty.drink()
重写
“”"
继承具有传递性
当父类方法不能满足子类的需求的时候可以对方法进行重写
1.覆盖父类的方法
2.对父类的方法进行扩展super.call( )
“”"
1.对原方法覆盖
class Animal:
def eat(self):
print('吃...')
def drink(self):
print('喝...')
def sleep(self):
print('睡...')
class Cat(Animal):
def call(self):
print('喵喵~')
class HelloKitty(Cat):
def sepak(self):
print('我可以说日语')
def call(self):
print('$@#%@%@')
kt = HelloKitty()
kt.eat()
kt.sepak()
kt.call()
2.对父类方法进行扩展,但是不覆盖其之前的方法
在python3中,方法下面加super().call()
在python2中,方法下面加父类名.方法名(self)
class Animal:
def eat(self):
print('吃...')
def drink(self):
print('喝...')
def sleep(self):
print('睡...')
class Cat(Animal):
def call(self):
print('喵喵~')
class HelloKitty(Cat):
def sepak(self):
print('我可以说日语')
def call(self):
super().call() #继承父类并扩展
#Cat.call(self)#python2中。是这样沿用的
print('$@#%@%@')
kt = HelloKitty()
kt.eat()
kt.sepak()
kt.call()
初始化方法的沿用
class Bird:
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print('$@$#$#$@#$')
self.hungry = False
else:
print('No thank')
# 在鸟类的基础上
class SongBird(Bird):
def __init__(self):
super().__init__()#若没有这句话,就不能沿用原始类的初始化方法,也就没有self.hungry.因此新产生的对象不能调用父类的方法
self.sound = 'AAAAAaaa!!!'
def sing(self):
print(self.sound)
bird = SongBird()
bird.eat() #需要牵扯hungry的概念,因此得沿用父类的初始化方法
bird.sing()#正常调用
新式类,旧式类新式类和旧式(经典)类:
object是Python为所有对象提供的基类,提供有一些内置的属性和方法,
可以使用dir函数查看
新式类:以object为基类的类
经典类 不以object为基类的类
在python3.X中定义的类时,如果没有指定父类,会默认使用object作为基类–
python3.x中定义的类都是新式类
在python2.x中定义类时,如果没有指定父类,则不会以object作为基类
为保证编写的代码能够同时在python2.x和python3.x运行
今后在定义类时,如果没有父类,建议统一继承自object
顺序继承
class A:
def test(self):
print('A----test方法')
def demo(self):
print('A-----demo方法')
class B:
def test(self):
print('B---test方法')
def demo(self):
print('B---demo方法')
class C(B,A): #方法名相同的时候,哪个在前就调用的哪个
pass
c = C()
c.test()
c.demo()
多态
多态(以封装和继承为前提)
不同的子类对象调用相同的方法 产生不同的结果
class Dog(object):
def __init__(self,name):
self.name = name
def game(self):
print('%s 开心的自己玩~' %(self.name))
class Gaofei(Dog):
# 父类的方法不能满足子类的需求 重写game方法
def game(self):
print('%s开心的和米老鼠玩~~' %(self.name))
class Person(object):
def __init__(self,name):
self.name = name
def game_with_dog(self,dog):
print('%s和%s开心的玩' %(self.name,dog.name))
dog.game()
# 创建一个狗对象
wangcai = Dog('大黄')
# wangcai = Gaofei('高飞')
# 创建一个人对象
xiaoming = Person('小明')
xiaoming.game_with_dog(wangcai)