内容回顾

上节课复习:
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面向对象——封装的更多相关文章

  1. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

  2. python面向对象封装案例(附:is和==的区别)

    面向对象封装案例 目标 封装 小明爱跑步 存放家具 01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对 ...

  3. python面向对象-封装-property-接口-抽象-鸭子类型-03

    封装 什么是封装: # 将复杂的丑陋的隐私的细节隐藏到内部,对外提供简单的使用接口 或 # 对外隐藏内部实现细节,并提供访问的接口 为什么需要封装 1.为了保证关键数据的安全性 2.对外部隐藏内部的实 ...

  4. Python—面向对象 封装03

    接着上面的一篇继续往下: 如何隐藏 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) class A: __x = 1 # _A__x = 1 def __init__(self, ...

  5. Python面向对象封装案例

    01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对象,然后 让对象调用方法 对象方法的细节 都被 封装 ...

  6. python面向对象封装案例2

    封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对象,然后 让对象调用方法 对象方法的细节 都被 封装 在 类 ...

  7. python面向对象(封装、多态、反射)

    目录 面向对象之封装 @property 面向对象之多态 面向对象之反射 面向对象之封装 含义 将类中的某些名字按照特殊的书写方式"隐藏"起来,不让外界直接调用,目的是为了不然外界 ...

  8. python面向对象-封装and多态

    python 接口类和抽象类 为什么讲封装之前要将这个东西? 我才不会说为什么 首先: python没有接口类这个概念!!!!!!!! 哈哈哈......神经病 python抽象类和接口类更接近于一种 ...

  9. Python面向对象----封装

    1. Python语言不是强类型语言, 公有和私有体现的不是很明显.私有成员可以通过 对象._ClassName__私有成员进行访问 2. 使用封装借助了装饰器 其实具有类get和set等操作

  10. python 面向对象 封装

    什么是封装 广义上的封装:代码的保护,面对对象的思想本身就是 只让自己的对象能调自己类的方法 狭义上的封装:将属性和方法藏起来 私有属性/私有方法 python没有真正意义的私有属性,可以通过调用实例 ...

随机推荐

  1. 曲线艺术编程 coding curves 第十二章 玑镂(扭索)纹

    第十二章 玑镂(扭索)纹 原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中物王二狗(sheldon) ...

  2. 【AI新趋势期刊#1】GPT自动理解视频、AI法律顾问、大模型安全围栏

    每天都要浏览大量AI相关新闻,是不是感到信息量爆炸,有效信息少? 这么多新产品和新工具,到底哪些是真正是有价值的,哪些只是浮躁的一时热点? 想参与AI产品和工具的开发,从哪里能够获得大量的灵感和思路? ...

  3. Lakehouse: A New Generation of Open Platforms that Unify Data Warehousing and Advanced Analytics

    在Delta Lake官网上提到的一篇新一代湖仓架构的论文. 这篇论文由Databricks团队2021年发表于CIDR会议. 这个会议是对sigmod和vldb会议的补充. 可以看到这篇论文和前一篇 ...

  4. 使用docker安装的tomcat部署activiti-app.war、activiti-admin.war失败(ClassNotFoundException)

    背景 一直以来习惯用docker配置一些本地学习环境,许多教程配置activiti的方式都是通过复制activiti的war包部署在tomcat中,我尝试了一下通过docker的方式遇到了一些不易察觉 ...

  5. 用极限网关实现 ES 容灾,简单!

    身为 IT 人士,大伙身边的各种系统肯定不少吧.系统虽多,但最最最重要的那套.那几套,大伙肯定是捧在手心,关怀备至.如此重要的系统,万一发生故障了且短期无法恢复,该如何保障业务持续运行? 有过这方面思 ...

  6. 结合ReentrantLock来看AQS的原理

    AQS的定义 ​ 队列同步器 AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架,它使用了一个 int 成员变量表示同步状态,通过内置的 F ...

  7. 2021-7-6 vue音乐播放器

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...

  8. PostgreSQL+GeoHash地图点位聚合

    PG数据库安装扩展 需要用到pg数据库的空间扩展postgis,在进行操作之前需要在数据库中安装扩展. CREATE EXTENSION postgis; CREATE EXTENSION postg ...

  9. CF1601 题解

    偶然看这一场的题目,忽然很有感觉,于是写了一下 A 题面 考虑每一位可以单独分开考虑 考虑单独的一位,每次要选 \(m\) 个位置,可能产生贡献的位置就是这位为 1 的数,设数量为 \(x\),则 \ ...

  10. Cilium系列-13-启用XDP加速及Cilium性能调优总结

    系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, ...