学习笔记来源于b站
目录
面向对象三大特性
- 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中
- 继承 实现代码的重用,相同的代码不需要重复的编写
- 多态 不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度
一、继承
继承:子类 拥有 父类 的所有的方法和属性
1、单继承
class 类名(父类名):
pass
- 子类 继承 父类,可以直接 享受 父类中已经封装好的方法,不需要再次开发
- 子类 中应该根据 职责,封装 子类特有的属性和方法
- 子类或者叫做派生类,父类或者叫做基类,继承或者叫做派生
- 继承具有传递性:子类 具有 父类以及父类的父类 中封装的所有的 属性和方法
- 当 父类 的方法不能满足子类的需求的时候,可以对方法进行重写(override)
- 重写父类有两种方法:覆盖父类的方法、对父类方法进行 扩展
2、多继承
class 类名(父类名1,父类名2,...):
pass
- 子类 可以拥有 多个父类,并且具有 所有父类的属性和方法
- 如果 不同的父类 中存在 同名的方法,应该尽量避免这样的情况
3、新式类和旧式(经典)类
object 是 python 为所有对象提供的 基类,提供所有一些内置的属性方法,可以使用dir函数查看
- python 2.x 与 python 3.x 定义类时会有区别,如果没有父类,建议统一继承自object
二、多态
不同 子类 对象 调用 相同的父类
多态 以 继承 和 重写父类方法 为前提,是调用的技巧,不会影响类内部设计
三、案例
需求
在 Dog
类中封装方法 game
- 普通狗只是简单的玩耍
定义 XiaoTianDog
继承自 Dog
,并且重写 game
方法
- 哮天犬需要在天上玩耍
定义 Person
类,并且封装一个 和狗玩 的方法
- 在方法内部,直接让 狗对象 调用
game
方法
class Dog(object):
def __init__(self,name):
self.name = name
def game(self):
print("%s jump and down!!!"%self.name)
class xiaotianDog(Dog):
def game(self):
print("%s fly in the sky!!!"%self.name)
class Person(object):
def __init__(self,name):
self.name = name
def game_with_dog(self,dog):
print("%s play with %s"%(self.name,dog.name))
dog.game()
wangcai = Dog("旺财")
xiaotian = xiaotianDog("哮天汪")
xiaoming = Person("小明")
xiaoming.game_with_dog(wangcai)
xiaoming.game_with_dog(xiaotian)
#输出
小明 play with 旺财
旺财 jump and down!!!
小明 play with 哮天汪
哮天汪 fly in the sky!!!