封装
1、 什么是封装?
封装,是面向对象的一个非常重要的特征,主要体现的是对数据的保护。
2、 为什么要有封装?
类比生活,每个对象自己的属性数据都可能是保密的,不能允许别人直接访问的!软件要还原生活场景(目的是为了更加准确的解决问题),就需要将这样的特性的体现出来,开发的软件才是更加健壮的。
3、 封装的步骤
① 所有属性私有化
**私有化,就是让属性变成当前对象自己的,**不允许别人(类型/对象外其他的类型/对象)直接访问。
语法规则:变量使用两个下划线开头
② 提供访问私有属性的方法
set方法是用来给属性赋值的。
get方法是用来给属性取值的。
③ 数据是怎么保护的?
继承
1、 什么是继承
继承,就是面向对象编程中的一个非常重要的特征,主要体现了类型中代码的复用性。
2、 为什么要继承?
类似生活中,通过继承关系,可以子承父业,在一个人刚出生的就已经继承了大量的资源,这些从父辈继承的资源可以直接重复利用,提高了资源的复用性。
代码中,通过继承语法,可以让两个或者多个类型之间,产生继承关系,儿子类型就可以继承父亲类型的属性和方法,父亲类型中的属性和方法就得到了重复使用的目的。
基本语法
父类声明:
class Father:
"""父亲类型"""
def __init__(self, name, gender, age):
self.name = name
self.gender = gender
self.age = age
def sleep(self):
print("睡觉时间到了,准备午休..")
def study(self):
print("充电时间到了,准备学习..")
子类声明:(子类继承父类,是通过类型声明后面的括号中,编写了要继承父类的名称,完成继承关系的建立。)
class Son(Father):
"""儿子类型:继承父亲类型"""
pass
子类重复使用父类的代码:
tom = Son("汤姆", "男", 18)
print(tom.name, tom.age, tom.gender)
tom.study()
tom.sleep()
深入继承关系案例:
class Animal:
"""动物类型"""
def __init__(self, nickname, amtype):
self.nickname = nickname
self.amtype = amtype
def move(self):
print("某个动物在运动中...")
class Beast(Animal):
"""地上跑的"""
def __init__(self, nickname, amtype, blood):
# 子类如果一旦编写__init__()方法
# 就必须显式的调用父类的__init__()方法初始化父类数据
# Animal.__init__(nickname, amtype)
# super(Beast, self).__init__(nickname, amtype)
# ① 复用父类的代码
super().__init__(nickname, amtype)
# ② 子类自己的代码
self.blood = blood
class Bird(Animal):
"""天上飞的"""
def __init__(self, nickname, amtype, attact):
# ① 复用父类的代码
super().__init__(nickname, amtype)
# ② 子类独有的代码
self.attact = attact
class Fish(Animal):
"""水里游的"""
pass
cat = Beast("汤姆猫", "走兽", 2000)
beita = Bird("开飞机的贝塔", "飞禽", 100)
xiaolu = Fish("水里的美人鱼", "游鱼")
print(cat.nickname, cat.amtype, cat.blood)
print(beita.nickname, beita.amtype, beita.attact)
cat.move()
beita.move()
xiaolu.move()
方法重载的扩展
方法重载,其实还原了生活中新事物对比老事物功能在进化,功能更加强大这样的一种扩展特性。[面向对象的扩展性非常好,方法重载也是一种体现]
方法重载案例:
class Animal:
"""动物类型"""
def __init__(self, nickname):
self.nickname = nickname
def move(self):
print(f"{self.nickname}在移动中..")
class Beast(Animal):
"""走兽"""
def move(self):
print(f"{self.nickname}在快速的奔跑中..")
class Bird(Animal):
"""飞禽"""
def move(self):
print(f"{self.nickname}在愉快的飞行中..")
class Fish:
"""游鱼"""
def __init__(self, nickname):
self.nickname = nickname
def swimming(self):
"""移动的方法"""
print("飞快的游走中...")
cat = Beast("汤姆猫")
shuke = Bird("舒克的飞机")
# 调用的是同一个方法,但是执行的是不同的结果
cat.move() # 汤姆猫在快速的奔跑中..
shuke.move() # 舒克的飞机在愉快的飞行中..
xiaolu = Fish("小鹿")
xiaolu.swimming()
'''
通过方法重写
① 理解继承的代码的重用型
② 继承关系中,对于子类中的代码有了一定的约束性
③ 方法覆盖,体现了一种运行时状态改变-体现了多态
如果子类没有重写父类的方法,就直接执行父类的方法
如果子类重写了父类的方法,就执行子类重写后的方法
'''
多继承
生活场景中,我们个人可能是公司的职员,在自己家是父亲的儿子,是妻子的老公,是孩子的父亲。一个人[对象]同时会在生活中的不同场景下扮演不同的角色,在代码中怎么体现?
(1) 多继承理论结构
(2) 多继承基础语法
多继承的基本语法,是将继承的类型依次(有顺序)声明在类型后面的括号中,描述当前类型继承的所有类型,当前类型就会拥有所有继承类型的公共的属性和公共的方法。
使用继承过来的数据:
多态
1、 什么是多态?
多态,是面向对象程序开发的一个重要的特征,没有固定的语法,主要体现为程序设计时考虑到的各种运行情况,以及运行过程中表现的多种状态的转换。
2、 通过案例看多态
class WebSite:
"""网站"""
def register(self, strategy):
"""
注册的方法:结构
:param strategy 具体的策略,告诉网站结构使用什么方式进行注册
"""
print("开始注册用户")
strategy.send("ABCD")
input("验证码已发送,请查收后输入,按任意键(输入成功)")
print("注册成功")
class Device:
"""算法 父类:规范子类中出现的方法"""
def send(self, code):
print("发送验证码", code)
class Phone(Device):
"""手机注册策略"""
def send(self, code):
print("通过手机发送验证码.", code)
class Email(Device):
"""邮箱注册策略"""
def send(self, code):
print("通过邮箱发送验证码.", code)
# 注册方式:策略
# device = Email()
device = Phone()
# 用户开始注册
ws = WebSite()
# 发起注册:将策略算法交给软件结构进行处理
ws.register(device)
用户[网站]注册的案例:设计模式中的行为模式:策略模式。