面向对象的语言的特征
封装 继承 多态[Python本身就是多态的]
多态: 事物的多种形态 Python本身是动态语言
a = 10
a = "hello"
java: 静态语言
声明变量的时候 必须指明变量的类型 必须赋予该类型的数据
int a = "100"
1.封装
在程序中的体现:
广义的封装
功能的封装
狭义的封装
将无需对外暴露的内容隐藏起来 然后提供设置和获取内容的方式(方法函数)
案例:
人类:
姓名 年龄 性别
在程序中体现的封装:
将属性给私有化[隐藏起来] 对外提供设置(set)和获取(get)的方式
好处:
可以在程序中添加根据生活需求产生的逻辑判断
隔离复杂度
保护隐私 不让外界随意修改
练习:
动物:
属性: 种类 性别 年龄
2.对象的属性是可以动态添加的
Python中没有真正的私有化 [掩耳盗铃]
在类中声明对象的属性的时候
只要执行了self.属性名 ---> 这个对象就具有这个属性了
使用self来进行添加的属性是属于该类所有对象的
在类的外面通过引用变量来添加属性
这种添加方式只有当前对象具有该属性 其他该类对象没有该属性
3.继承
程序中的继承:
有两个或者两个以上的相关普通类中 提取出相同的特性 将这些提到一个共通类中 以指定的方式将普通类与共通类关联起来 形成继承体系
共通类: 称之为 父类 超类 基类
普通类: 称之为 子类
案例:
学生类:
属性:
姓名
性别
年龄
学号
行为:
吃饭
学习
工人类:
属性:
姓名
性别
年龄
工号
行为:
吃饭
工作
学生是人 工人是人 通过人类来进行关联
人类:
属性:
姓名
年龄
性别
行为:
吃饭
在继承体系中 子类获取父类中的可见属性或者调用父类中的方法 直接调用 就像调用自己的一样
如果私有化封装的内容 还是需要父类提供获取和设置的方式 子类才可以获取
4.继承关系
继承分为单继承和多继承 Python支持的是多继承
多层继承: 间接继承关系
单继承是代表 某个普通类有且仅有一个直接父类 但是可以有多个间接父类
class A:
pass
class B(A):
pass
class C(B):
pass
多继承 : 某个普通类有且仅有多个直接父类 但是可以有多个间接父类
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
案例:
动物体系:
狗类dog
蝙蝠类bat
鸵鸟类ostrich
鹦鹉类parrot
动物类
能走的 哺乳类 鸟类 能飞的
dog dog ostrich bat
ostrich bat parrot parrot
5.继承体系中方法的重写
特殊的类: object —> 是所有类的根类 相当于族谱中的祖宗的位置
当一个类没有体现继承关系的 默认就是继承自object
类名.bases 可以体现出该类继承的父类
类名.mro() 体现的是该类的继承体系
自定义方法的重写
父类提取的是子类共通的特性 包含共通的行为
如果子类中功能的实现内容与父类中功能的实现内容不一致 子类可以对该方法进行重写
重写的时候注意:
子类中该方法的签名与父类中的方法签名一致
方法签名:
def 函数名(形参列表):
函数体
def 函数名(形参列表) ---> 被称之为方法签名
当子类重写了父类方法 子类再来调用该方法 调用时其本身重写之后的方法
有一种需求:
子类重写方法之后 调用该功能时 还想实现父类的 也想实现自己的
可以在子类重写的方法中 通过super().父类中的方法 将父类中的方法进行执行
案例:
愤怒的小鸟:
小红鸟
颜色
攻击
小黑鸟
颜色
攻击
小黄鸟
颜色
攻击
系统方法的重写
__str__()
对于程序外部而言的
例如想在控制台上查看对象的信息 会调用该对象的__str__方法
__repr__()
针对于程序中其他数据而言的
比如将对象添加到列表中 想通过列表查看对象的信息 调用的就是该对象的__repr__方法