什么是面向对象
面向过程:一种以过程为中心的编程思想(第一步、第二步、第三步);处理简单的事情
面向对象:一种更符合人类思维习惯的编程思想,不断的创建对象,操作对象做事情。处理复杂的事情
面向对象,解决了系统的可维护性、可扩展性、可重用性
面向对象的定义:
语言层面,封装代码和数据
规格层面,对象是一系列可被使用的公共接口
从概念层面,对象是某种拥有责任的抽象
面向对象程序设计规则
1.首先分析有哪些类
2.每个类由那些属性和行为
3.类与类之间存在的关系
类、方法、 类变量的定义、实例引用、实例变量使用
类 : 抽象的概念,一类事物
方法: 类中定义的函数,对外提供的服务
类变量: 类变量在整个实例化的对象中是公用的
实例引用: 实例化一个对象
实例变量 : 以self.变量名 的方式定义的变量
# 通过Class 关键字,定义一个类
class Person:
name = '王五'
age = 19
gender = '男'
weigth = 70
# 通过 init方法,在初始化时,给类变量赋值
def __init__(self, name, age, gender, weigth):
# self.name 是实类变量
self.age = age
self.name = name
self.gender = gender
self.weight = weigth
def wan(self):
print('类方法,玩')
# 添加装饰器,通过类调用此方法
@classmethod
def zhuangshiqi(self):
print('加装饰器,通过类调用此方法')
# 把类实例成一个对象
zs = Person('张三', 19, '男', 122)
# 通过实例调用类的 属性(变量)、函数(方法)
print(f'实例的姓名是{zs.name},实例的年龄{zs.age},实例的性别{zs.gender},实例的体重{zs.weight}')
# 把类实例成一个对象
ls = Person('李四', 19, '男', 122)
# 通过实例调用类的 属性(变量)、函数(方法)
print(f'实例的姓名是{ls.name},实例的年龄{ls.age},实例的性别{ls.gender},实例的体重{ls.weight}')
# 类变量,实例变量的区别
# 类变量,需要类引用;实例变量,使用实例引用
print(Person.name)#打印类变量
print(zs.name)# 打印实例变量
Person.name = Person.name+'修改后' # 修改类变量
zs.name = zs.name +'修改后' # 修改实例变量
print(f'修改后的类变量:{Person.name}')
print(f'修改后的实例变量:{zs.name}')
# 类方法和实例方法的区别;
# 使用类不能调用实例方法
Person.wan()
# 实例调用方法
zs.wan()
Person.zhuangshiqi()
面向对象的三大特性,封装、集成多态
封装
封装实例
# 以飞机为例,封装飞机的一些属性、类
class AirPlan:
name = ''
color = ''
def set_color(self, color):
self.color = color
print(f'飞机的颜色是:{self.color}')
def set_name(self, name):
self.name = name
print(f'飞机的名字是:{self.name}')
air = AirPlan()
air.set_name('第一架飞机')
air.set_color('红色')
air = AirPlan()
air.set_name('第二架飞机')
air.set_color('绿色')
继承
子类继承父类的,属性方法
# 民用机,继承父类
class CiviAirplan(AirPlan):
# 定义民用机方法
def load_person(self, num):
print(f'民用机,能载人数为:{num}')
# 如果 子类定义了和父类相同名字的方法,实例调用时会调用子类定义的的方法
def set_name(self, name):
print('民用机的set_name')
cair = CiviAirplan()
cair.set_color('红色')
cair.set_name('第一架民用飞机')
# 调用民用机方法
cair.load_person(123)
多态
在 继承的基础之上,重新定义 父类的方法
# 军用飞机,多态演示
class JunYAirplan(AirPlan):
name = '军用机'
def set_name(self, name1):
print(f'当前{self.name}的名字是****{name1}')
jair = JunYAirplan()
jair.set_name('传的name')