Python面向对象——封装
内容回顾
上节课复习:
1、编程范式/思想
面向过程
介绍:
核心是"过程"二字
过程就是"流水线"
过程终极奥义是将程序流程化
优点:
1、将程序流程化,进而程序的设计会变得简单化
缺点:
1、可扩展性差
面向对象
介绍:
核心是"对象"二字
对象就是"容器",用来盛放数据与功能
对象终极奥义是将程序进行高度整合
优点:
1、提升程序的解耦合程度,进而增强程序的可扩展性
缺点:
1、设计复杂
2、面向对象编程
一:现实生活中:
1、先找出现实生活中的对象
2、然后总结归纳出现实生活中的类
二:程序中:
1、先定义程序中的类
2、后调用类产生程序中对象(调用类的过程又称之为实例化)
class Student:
school = 'Oldboy'
# 该方法会在对象产生之后自动执行,专门为对象进行初始化操作,可以有任意代码,但一定不能返回非None的值
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
def choose(self):
print('%s is choosing a course' % self.name)
stu1 = Student('李建刚', '男', 28)
stu2 = Student('王大力', '女', 18)
1、类中的数据属性
print(id(Student.school))
print(id(stu1.school))
print(id(stu2.school))
Student.school = 1111111
stu1.school = 1111111
print(stu1.school)
print(stu2.school)
2、类中的函数属性
print(Student.choose)
Student.choose(stu1) # 类可以用,但就是一个普通函数
stu1.choose()
stu2.choose()
print(Student.__dict__)
print(stu1.__dict__)
print(stu2.__dict__)
Student.xxx = 1
print(Student.xxx)
stu1.age = 20
stu1.yyy = 30
print(stu1.xxx)
stu1.xxx = 3333333333
print(stu1.__dict__)
print(stu1.xxx)
print(stu2.xxx)
l = [] # l=list([])
print(type(l))
print(type(stu1))
封装
一:封装介绍 封装是面向对象三大特性最核心的一个特性 封装 < – >整合
二、将封装的属性进行隐藏操作
1、如何隐藏:在属性名前加__前缀, 就会实现一个对外隐藏属性效果
三、该隐藏需要注意的问题:
I: 在类外部无法直接访问双下滑线开头的属性,但知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如Foo._A__N, 所以说这种操作并没有严格意义上地限制外部访问,仅仅只是一种语法意义上的变形。
class Foo:
__x = 1 # _Foo__x
def __f1(self): # _Foo__f1
print('from test')
# print(Foo.__dict__) 打印出所有的变量
# print(Foo._Foo__x)
# print(Foo._Foo__f1)
II:这种隐藏对外不对内, 因为__开头的属性会在检查类体代码语法时统一发生变形
class Foo:
__x = 1 # _Foo__x = 1
def __f1(self): # _Foo__f1
print('from test')
def f2(self):
print(self.__x) # print(self._Foo__x)
print(self.__f1) # print(self._Foo__f1)
print(Foo.__x)
print(Foo.__f1)
obj = Foo()
obj.f2()
III: 这种变形操作只在检查类体语法的时候发生一次,之后定义的__开头的属性都不会变形
class Foo:
__x = 1 # _Foo__x = 1
def __f1(self): # _Foo__f1
print('from test')
def f2(self):
print(self.__x) # print(self._Foo__x)
print(self.__f1) # print(self._Foo__f1)
Foo.__y = 3
print(Foo.__dict__)
print(Foo.__y)
class Foo:
__x = 1 # _Foo__x = 1
def __init__(self, name, age):
self.__name = name
self.__age = age
obj = Foo('egon', 18)
print(obj.__dict__)
print(obj.name, obj.age)
为何要隐藏?
I、隐藏数据属性"将数据隐藏起来就限制了类外部对数据的直接操作,然后类内应该提供相应的接口来允许类外部间接地操作数据,接口之上可以附加额外的逻辑来对数据的操作进行严格地控制
class People:
def __init__(self, name):
self.__name = name
def get_name(self):
# 通过该接口就可以间接地访问到名字属性
# print('小垃圾,不让看')
print(self.__name)
def set_name(self, val):
if type(val) is not str:
print('小垃圾,必须传字符串类型')
return
self.__name = val
# 使用者:王鹏
obj = People('egon')
print(obj.name) # 无法直接用名字属性
obj.set_name('EGON')
obj.set_name(123123123)
obj.get_name()
# II、隐藏函数/方法属性:目的的是为了隔离复杂度
作业
# 整合->解耦合->扩展性增强
class School:
school_name = 'OLDBOY'
def __init__(self, nickname, addr):
self.nickname = nickname
self.addr = addr
self.classes = []
def related_class(self, class_obj):
# self.classes.append(班级名字)
# self.classes.append(class_name)
self.classes.append(class_obj)
def tell_class(self): # 改
# 打印的班级的名字
print(self.nickname.center(60, '='))
# 打印班级开设的课程信息
for class_obj in self.classes:
class_obj.tell_course()
# # 一:学校
# #1、创建校区
school_obj1 = School('老男孩魔都校区', '上海')
school_obj2 = School('老男孩帝都校区', '北京')
# 2、为学校开设班级
# 上海校区开了:脱产14期,上海校区开了脱产15期
school_obj1.related_class("脱产14期")
school_obj1.related_class("脱产15期")
# 北京校区开了:脱产29期
school_obj2.related_class("脱产29期")
# 3、查看每个校区开设的班级
school_obj1.tell_class()
school_obj2.tell_class()
class Class:
def __init__(self, name):
self.name = name
self.course = None
def related_course(self, course_obj):
# self.course = course_name
self.course = course_obj
def tell_course(self):
print('%s' % self.name, end=" ")
self.course.tell_info() # 打印课程的详细信息
# 二:班级
# 1、创建班级
class_obj1 = Class('脱产14期')
class_obj2 = Class('脱产15期')
class_obj3 = Class('脱产29期')
# 2、为班级关联一个课程
class_obj1.related_course('python全栈开发')
class_obj2.related_course('linux运维')
class_obj3.related_course('python全栈开发')
# 3、查看班级开设的课程信息
class_obj1.tell_course()
class_obj2.tell_course()
class_obj3.tell_course()
# 4、为学校开设班级
# 上海校区开了:脱产14期,上海校区开了脱产15期
school_obj1.related_class(class_obj1)
school_obj1.related_class(class_obj2)
# 北京校区开了:脱产29期
school_obj2.related_class(class_obj3)
school_obj1.tell_class()
school_obj2.tell_class()
class Course:
def __init__(self, name, period, price):
self.name = name
self.period = period
self.price = price
def tell_info(self):
print('<课程名:%s 周期:%s 价钱:%s>' % (self.name, self.period, self.price))
# 三:课程
# 1、创建课程
course_obj1 = Course('python全栈开发', '6mons', 20000)
course_obj2 = Course('linux运维', '5mons', 18000)
# 2、查看课程的详细信息
course_obj1.tell_info()
course_obj2.tell_info()
# 3、为班级关联课程对象
class_obj1.related_course(course_obj1)
class_obj2.related_course(course_obj2)
class_obj3.related_course(course_obj1)
class_obj1.tell_course()
class_obj2.tell_course()
class_obj3.tell_course()
school_obj1.tell_class()
school_obj2.tell_class()
class Student:
pass
1、练习上课作业讲解的面向对象代码,明天默写
2、基于上课作业讲解的面向对象代码,扩写Student类
3、加入序列化与反序列化操作
4、对象之间的关联采用id号
5、可以通过id找到对应的文件,然后从文件中反序列化出执行的学校、班级、课程、学生对象
Python面向对象——封装的更多相关文章
- python面向对象(封装,继承,多态)
python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...
- python面向对象封装案例(附:is和==的区别)
面向对象封装案例 目标 封装 小明爱跑步 存放家具 01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对 ...
- python面向对象-封装-property-接口-抽象-鸭子类型-03
封装 什么是封装: # 将复杂的丑陋的隐私的细节隐藏到内部,对外提供简单的使用接口 或 # 对外隐藏内部实现细节,并提供访问的接口 为什么需要封装 1.为了保证关键数据的安全性 2.对外部隐藏内部的实 ...
- Python—面向对象 封装03
接着上面的一篇继续往下: 如何隐藏 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) class A: __x = 1 # _A__x = 1 def __init__(self, ...
- Python面向对象封装案例
01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对象,然后 让对象调用方法 对象方法的细节 都被 封装 ...
- python面向对象封装案例2
封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对象,然后 让对象调用方法 对象方法的细节 都被 封装 在 类 ...
- python面向对象(封装、多态、反射)
目录 面向对象之封装 @property 面向对象之多态 面向对象之反射 面向对象之封装 含义 将类中的某些名字按照特殊的书写方式"隐藏"起来,不让外界直接调用,目的是为了不然外界 ...
- python面向对象-封装and多态
python 接口类和抽象类 为什么讲封装之前要将这个东西? 我才不会说为什么 首先: python没有接口类这个概念!!!!!!!! 哈哈哈......神经病 python抽象类和接口类更接近于一种 ...
- Python面向对象----封装
1. Python语言不是强类型语言, 公有和私有体现的不是很明显.私有成员可以通过 对象._ClassName__私有成员进行访问 2. 使用封装借助了装饰器 其实具有类get和set等操作
- python 面向对象 封装
什么是封装 广义上的封装:代码的保护,面对对象的思想本身就是 只让自己的对象能调自己类的方法 狭义上的封装:将属性和方法藏起来 私有属性/私有方法 python没有真正意义的私有属性,可以通过调用实例 ...
随机推荐
- 一次性掌握innodb引擎如何解决幻读和不可重复读
了解mysql的都知道,在mysql的RR(可重复)隔离级别下解决了幻读和不可重复.你知道RR下是怎么解决的吗,很多人会回答是通过MVCC和next-key解决的,具体是怎么解决的,今天来重点分析下. ...
- 【TVM模型编译】1. onnx2relay.md
上一篇介绍了onnx模型在tvm中优化的总体流程. 在这一篇中,介绍onnx模型到relay模型的转换流程,主要涉及了以下几个方面: onnx算子到relay算子转换 relay算子实现 这一篇介绍o ...
- 《HelloGitHub》第 87 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...
- 了解web网络基础
TCP/IP 协议:一种规则,规定不同计算机操作系统,硬件之间怎么通信的一种规则 像这样把互联网相关联的协议集合起来总称为TCP/IP协议. TCP/IP分层管理 按照组层次分为以下四层: 应用层:决 ...
- Python 学习路线图
Python 学习路线图 在这个系列笔记中,我将陆续整理自己在学习 Python 编程语言及其框架的过程中留下的笔记和代码,目的是掌握如何在生产环境中利用各种领域的第三方框架来快速开发应用程序.和大多 ...
- 跟着 GPT-4 从0到1学习 Golang 并发机制(三)
目录 一.前言 二.开聊 2.1 关于 goroutine 泄露问题 2.2 内存模型 2.3 Race Detector 检测数据竞争 三.总结 一.前言 话接上回<跟着 GPT-4 从0到1 ...
- VSCode中的快捷键
VS Code中的快捷键 文件和编辑操作 Ctrl+S:保存文件 Ctrl+K S:保存全部文件 Ctrl+C:复制 Ctrl+V:粘贴 Ctrl+X:剪切 Ctrl+F:查找 Ctrl+H:替换 C ...
- flash 游戏分析 - 1
游戏 我们就以<猎人的生存日记>(Orion Sandbox)这款游戏来分析. 下载链接 用FlashStart打开Orion Sandbox 1.swf 我们需要反复进入游戏,可以先打开 ...
- 如何使用iptables防火墙模拟远程服务超时
前言 超时,应该是程序员很不爱处理的一种状态.当我们调用某服务.某个中间件.db时,希望对方能快速回复,正确就正常,错误就错误,而不是一直不回复.目前在后端领域来说,如java领域,调用服务时以同步阻 ...
- Java的readBytes是怎么实现的?
1.前言 众所周知,Java是一门跨平台语言,针对不同的操作系统有不同的实现.本文从一个非常简单的api调用来看看Java具体是怎么做的. 2.源码分析 从FileInputStream.java中看 ...