python多态与继承
面向对象三大特性:
- 封装:根据职责将属性和方法封装到一个抽象的类中
- 继承:实现代码的重用,相同代码不需要重复的编写
- 多态:不同的对象调用相同的方法,产生不同的结果,增加代码的灵活度
一、继承
1、概念
继承的概念:
1、子类拥有父类的所有方法和属性
2、不包括私有属性和私有方法
继承的优点:
1、实现代码重用
2、简化代码的结构
3、便于代码的维护和管理
4、但是不能够提升代码的运行速度
每个对象都有相同的方法,代码大量重复。
2、单继承
1)单父类与子类的继承
class 类名(父类名):
pass
子类继承父类,可以直接享受父类中已经封装好的方法,不需要再次开发;子类中应该根据职责封装子类特有的属性和方法。
class Animal:
def __init__(self):
self.name = "动物"
self.age = 2
def eat(self):
print("%s 都爱吃" % self.name)
# 单继承
class Cat(Animal):
def catch(self):
print("猫抓老鼠")
animal = Animal()
print(animal.name)
print(animal.age)
animal.eat()
# 父类对象不能调用子类的方法,也不能访问子类的属性
print("*" * 50)
# 子类对象调用父类的方法和属性
cat = Cat()
print(cat.name)
print(cat.age)
cat.eat()
cat.catch()
2)子类、父类、爷爷类的关系
class Animal:
def __init__(self):
self.name = "动物"
self.age = 2
def eat(self):
print("%s 都爱吃" % self.name)
# 单继承
class Cat(Animal):
def catch(self):
print("猫抓老鼠")
class Bosicat(Cat):
def sing(self):
print("波斯猫会唱歌")
animal = Animal()
print(animal.name)
print(animal.age)
animal.eat()
print("*" * 50)
# 子类对象调用父类的方法和属性
cat = Cat()
print(cat.name)
print(cat.age)
cat.eat()
cat.catch()
print("*" * 50)
# 子类对象调用父类以及爷爷类的方法和属性
bsm = Bosicat()
print(bsm.name)
print(bsm.age)
bsm.eat()
bsm.catch()
bsm.sing()
3)方法的重写
重写的概念:
子类中有与父类相同的方法名,
重写的原因:
当父类的函数无法满足子类的需求,则需要方法的重写
前提:
两者要有继承的关系
重写的两种方式:
1、覆盖父类的方法:子类重写的方法与父类完全不同
2、对父类方法进行拓展:子类重写的方法是在父类方法的基础上进行功能拓展
(1)方法重写:覆盖
class Animal:
def __init__(self):
self.name = "动物"
self.age = 2
def eat(self):
print("%s 都爱吃" % self.name)
# 单继承
class Cat(Animal):
def catch(self):
print("猫抓老鼠")
class Bosicat(Cat):
# 重写父类的功能
def catch(self):
print("波斯猫抓鱼")
def sing(self):
print("波斯猫会唱歌")
bsm = Bosicat()
bsm.catch()