在python 中 面向对象是指一种编程思想 00P 面向对象编程。
面向的对象:
一切皆对象(将现实中所有的需求、数组等都可以抽象成程序中的对象)
面向对象:Python,先有数据结构 在再有算法。
面向对象三大特性 封装:类封装数据与操作方法 继承:子类继承并且拥有父类的数据与操作 多态:子类继承并且重写父类方法
面向对象“类”的概念
面向对象中类的概念是指将对象进行抽象, 不是具体化的内容,
比如人类 就属于一个 类
这个类里面还可以具体化成具体的某一个人 如“张三”
类的声明周期:
_ _ init _ _ 初始化
_ _ del _ _清理销毁
python中类的编写方法,采用class 类名: 形式进行类的定义, 需注意类名中各个单词的首字母需大写。
初始化函数用来设置类的数据, 默认返回一个实例 self 下例中 name为增加的类的数据
class Person:
"""
抽象的人类
"""
def __init__(self, name):
"""
初始化函数: 用于设置数据
初始化函数 默认返回一个实例
默认返回self
不需要return
"""
print("初始化函数执行了", name)
self.name = name
def __del__(self):
"""
清理函数
"""
print("清理函数执行了")
定义一个具体的实例p1 p1变量(实例) 用于接受 初始化函数的返回值 (类名+()会执行初始化函数) # p1 和 p2 都是实例
p1 = Person("张三")
print(p1.name)
p2 = Person("李四")
print(p2.name)
类与实例
可以将类理为 抽象的模板 实例则是由模板克隆出来的具体的内容。
比如下例 类型 “月饼” 月饼类 可以有种类 大小 价钱的数据
实例可以有五仁和蛋黄月饼 包括类型中的数据可以进行定义添加
class MoonCake:
"""
月饼类
"""
def __init__(self, tp, size, money):
"""
初始化函数为了初始化 self的数据
初始化函数默认返回self
:param tp:
"""
# print(f"可以得到一个类型为{tp}的月饼, 并且返回这个月饼")
self.mat = tp
self.sz = size
self.my = money
def show(self):
"""
返回当前实例信息 谁调用self self就是谁
"""
return f"材料:\t{self.mat}, 尺寸:\t{self.sz}, 价格:\t{self.my}"
五仁月饼 = MoonCake("五仁", "大", 10)
print(五仁月饼.show())
蛋黄月饼 = MoonCake("蛋黄", "小", 50)
print(蛋黄月饼.show())
类的继承
封装:为了提升复用(为了减少代码编写) 类: 是将数据与操作进行封装 继承:为了减少代码的编写 通过父子类的继承关系 实现在子类中使用父类的功能, 子类继承父类 可以使用父类内容
例:父类 :人类 定义父类 功能 可以移动
子类: 张三 定义子类功能 可以飞
通过继续的使用 使子类 可以使用父类中的可以移动功能
子类并未定义 可以移动的功能 但使用继承功能后 可以得到父类中的 可以移动功能。
class Person(object):
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
def move(self):
print("可以移动")
class SuperPerson(Person):
def __init__(self, name, age):
super().__init__(name)
self.age = age
def __str__(self):
return f"{self.name} {self.age}"
def fly(self):
print("可以飞")
p1 = Person("张三")
print(p1)
p1.move()
sp1 = SuperPerson("张三", 20)
print(sp1)
sp1.move()
sp1.fly()
p1 结果:
张三 20
可以移动
可以飞
多继承
继承:在本类没有初始化函数 则去父类中找初始化函数 多继承:可以有多个父类 类的__mro__属性可以获取其查找顺序 多继承时,默认python3的深度优先 先找完一个分支以及所有子分支 在找另一个分支
设定三个父类:有同样的功能 move
class Walk:
def move(self):
print("走")
class Fly:
def move(self):
print("飞")
class Swimming:
def move(self):
print("游泳")
设定子类 技能 skill 继承父类 飞 和游泳
class Skill(Fly, Swimming):
def move(self):
print("技能")
定义子类 人 继承父类 skill 和 walk
class Person(Skill, Walk):
def move(self):
print("人动")
运用 Print(Person.__mro__) 得到子类功能的查找顺序:
子类本身 - 父类 技能 - 飞 - 游泳 - 父类walk
(<class '__main__.Person'>, <class '__main__.Skill'>, <class '__main__.Fly'>, <class '__main__.Swimming'>, <class '__main__.Walk'>, <class 'object'>)
最终结果为 子类本身中的功能 move 人动