一、什么是封装

封装是面向对象的三大特性中最核心的一个特性

封装<==>整合

二、将封装的属性进行隐藏操作

1 如何隐藏:

在属性钱加__前缀,就会实现一个对外隐藏熟悉的效果

class Foo:
__x = 10
def __f1(self):
print("我是f1")

1.1 强行访问:

虽然在外部我们无法访问类中被隐藏的属性,但是只要只要该属性的名字和类名就可以拼出名字_类.__属性

print(Foo._Foo__x)
>>>10

所以可以理解为这种隐藏只是一种对属性名的变形,并不是完全无法访问。

1.2 内部逻辑

由上面的实验我们不由的引发一个问题,这种隐藏是在类的哪一个阶段执行的

class Foo:
__x = 10
def __f1(self):
print("我是f1")
def f2(self):
self.__f1()
print(self.__x) foo_obj = Foo()
foo_obj.f2()
>>>我是f1
>>>10

通过测试我们可以知道在类定义阶段,我们可以用__开头去访问类中的属性,说明这种变形是在类定义阶段就产生的

并且这种隐藏对外不对内

三、为何要封装

封装给我们带来了两种场景的便利

场景1:我们需要对对象访问某些数据加以严格的条件判断

class People:
def __init__(self, name):
self.__name = name def get_name(self):
# 通过该接口就可以间接地访问到名字属性
print(self.__name) def set_name(self,val):
# 通过该接口就可以间接地修改名字属性
if type(val) is not str:
print('小垃圾,必须传字符串类型')
return
self.__name=val

由此,我们在访问People这个类的对象内的属性时候,我们不能直接用对象.的方式去修改name,必须通过我们定义类的时候设定好的接口来实现访问和修改功能。

场景二:隐藏函数/方法属性:目的的是为了隔离复杂度

class ATM:
def __card(self): # 插卡
print('插卡') def __auth(self): # 身份认证
print('用户认证') def __input(self): # 输入金额
print('输入取款金额') def __print_bill(self): # 打印小票
print('打印账单') def __take_money(self): # 取钱
print('取款') def withdraw(self): # 取款功能
self.__card()
self.__auth()
self.__input()
self.__print_bill()
self.__take_money() user_obj = ATM()
user_obj.withdraw()

ATM类有只有一个功能是取款,但是取款又需要分开很多小步骤,这些步骤只要类知道,不需要提供给使用者,这种情况就可以把它隐藏起来

day28 封装的更多相关文章

  1. [C#] 简单的 Helper 封装 -- RegularExpressionHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. iOS开发之App间账号共享与SDK封装

    上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...

  3. Ajax实现原理,代码封装

    都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...

  4. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  5. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

  6. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  7. 封装集合(Encapsulate Collection)

    封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ...

  8. CSharpGL(29)初步封装Texture和Framebuffer

    +BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(29)初步封装Texture和Framebuffer +BIT祝威+悄悄在此留下版了个权的信息说: Texture和Framebuffe ...

  9. CSharpGL(7)对VAO和VBO的封装

    CSharpGL(7)对VAO和VBO的封装 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入门参考 ...

随机推荐

  1. 01.Wireshark入门

    Wireshark官网下载地址: https://www.wireshark.org/#download

  2. nacos部署注意点

    官方Naming Configuration Service https://nacos.io/zh-cn/docs/deployment.html 划重点 单机部署 单机部署默认嵌入式存储数据 支持 ...

  3. C#数据结构与算法系列(一):介绍

    1.介绍 数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合用计算机存储.组织数据的方式.数据结构分别为逻辑结构.(存储)物理结构和数据的运算三个部分. 数据结构包括:线性结构和非线性结构. ...

  4. SUBSTRING / CHARINDEX_函数随手练_2

    SUBSTRING / CHARINDEX_函数随手练_2环境:MSSQL 2014(AdventureWorks2008R2附加到2014中的表 Location) /* Learning SQL ...

  5. CPU性能分析工具原理

    转载请保留以下声明 作者:赵宗晟 出处:https://www.cnblogs.com/zhao-zongsheng/p/13067733.html 很多软件都要做性能分析和性能优化.很多语言都会有他 ...

  6. elasticsearch unassigned shards 导致RED解决

    先通过命令查看节点的shard分配整体情况 curl -X GET "ip:9200/_cat/allocation?v" 说明:有16个索引未分片 2.查看未分片的索引 curl ...

  7. jmeter的beanshell

    [beanshell] 简单介绍beanshell,小型的java源代码解释器 运行下beanshell [常用命令] print() 输出内容到命令行中 (1)也可以在beanshell中自定义 [ ...

  8. 从 0 开始机器学习 - 神经网络反向 BP 算法!

    最近一个月项目好忙,终于挤出时间把这篇 BP 算法基本思想写完了,公式的推导放到下一篇讲吧. 一.神经网络的代价函数 神经网络可以看做是复杂逻辑回归的组合,因此与其类似,我们训练神经网络也要定义代价函 ...

  9. 004.OpenShift命令及故障排查

    一 CLI访问OpenShift资源 1.1 资源操作 OCP将OpenShift集群中的为由主节点管理的对象统称为资源,如:node.service.pod.project.deployment.u ...

  10. Python多核编程mpi4py实践及并行计算-环境搭建篇

    1.安装python,这个没什好说的,直接装就行 2.做并行计算.数据挖掘,机器学习等一般都要用的numpy,这个在Windows版本上安装有点问题,安装比较麻烦,建议在linux上搭建环境 3.安装 ...