面向对象–三大特性
- 封装 根据职责将 属性 和 方法 封装到一个抽象 类 中
- 继承 实现代码的重用(复用),实现相同的代码不需要重复的编写
- 多态 不同的子类对象调用相同的父类方法,产生不同的执行结果,增加代码灵敏度
面向对象–封装
封装
- 封装 是面向对象编程的一大特点
- 面向对象编程的第一步一一将属性和方法封装到一个抽象的类中
- 外界使用类创建对象, 然后让对象调用方法
- 对象方法的细节 都被 封装 在 类的内部
举例:图书管理系统
class Book:
def __init__(self,name,author,num):
self.name = name
self.author = author
self.num = num
def addBook(self):
print(f"新增图书《{self.name}》, 作者是 {self.author} , 库存有 {self.num} 本")
def delBook(self):
self.num -= 1
print(f"删除一本《{self.name}》, 作者是 {self.author} , 剩余库存有 {self.num} 本")
def __str__(self):
return f"图书《{self.name}》, 作者是 {self.author} , 库存有 {self.num} 本"
book1 = Book("笑傲江湖","金庸",500)
book1.addBook()
book1.delBook()
print(book1)
book2 = Book("连城诀","金庸",1000)
print(book2)
应用:摆放家具
对象的关系有 一对一 一对多 多对多(例:一个老师有多个学生,一个学生有多个老师)。在日常的开发中绝大部分情况都是一对多,就算是多对多也会拆成两份一对多进行开发
开发一对多关系的,要先开发“多”,再开发“一”
class HouseItem:
"""
@ Author: EvanZhang
@ Date: 2025/4/7 11:23
@ Info: 存储家具数据
"""
def __init__(self,name,area):
self.name = name
self.area = area
class House:
"""
@ Author: EvanZhang
@ Date: 2025/4/7 11:09
@ Info: 房子
"""
def __init__(self,name,area):
self.name = name
self.area = area
self.freearea = area
self.item = []
def addIten(self, house_item):
if house_item.area > self.freearea:
return
iteminfo = []
iteminfo.append(house_item.name)
iteminfo.append(house_item.area)
self.item.append(iteminfo)
self.freearea -= house_item.area
def __str__(self):
return f"房屋户型:{self.name},总面积:{self.area},剩余面积:{self.freearea},家具列表:{self.item}"
bad = HouseItem("双人床",4)
chest = HouseItem("衣柜",2)
table = HouseItem("餐桌",1.5)
house = House("两室一厅",90)
house.addIten(bad)
house.addIten(chest)
print(house)
私有属性和私有方法
应用场景
- 在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到
- 私有属性 就是 对象 不希望公开的 属性
- 私有方法 就是 对象 不希望公开的 方法
定义方式
- 在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法
class Women:
def __init__(self, name):
self.name = name
# 不要问女生的年龄
self.__age = 18
def secret(self):
print("我是 %s 我的年龄是 %d" %(self.name , self.__age))
xiaofang = Women("小芳")
xiaofang.secret()
私有属性暴力访问
提示:在日常开发中,不要使用这种方式,访问对象的 私有属性 或 私有方法
Python
中,并没有 真正意义 的 私有
- 在给 属性、方法 命名时,实际是对 名称 做了一些特殊处理,使得外界无法访问到
- 处理方式:在 名称 前面加上
_类名
=>_类名__名称
# 私有属性,外部不能直接访问到
print(xiaofang._Women__age)
# 私有方法,外部不能直接调用
xiaofang._Women__secret()