一、什么是封装

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

封装<==>整合

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

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. Flask g 对象

    1.什么是g对象? 在 flask 中,有一个专门用来存储用户信息的 g 对象,g的全称的为global. g 对象在一次请求中的所有的代码的地方,都是可以使用的. 赋值方式 from flask i ...

  2. 时间序列神器之争:prophet VS lstm

    一.需求背景 我们福禄网络致力于为广大用户提供智能化充值服务,包括各类通信充值卡(比如移动.联通.电信的话费及流量充值).游戏类充值卡(比如王者荣耀.吃鸡类点券.AppleStore充值.Q币.斗鱼币 ...

  3. HTML5 3D 粒子波浪动画特效DEMO演示

    需要thress.js插件:     http://github.com/mrdoob/three.js // three.js - http://github.com/mrdoob/three.js ...

  4. Python使用wxpy模块实现微信两两群组消息同步

    python使用wxpy模块提供的微信API接口实现两两群组的消息同步 安装模块: pip install wxpy 注意:需要同步的微信群需要保存到通讯录中 以下是自己闲来无事写的代码,暂时还存在以 ...

  5. DML_Data Modification_UPDATE

    DML_Data Modification_UPDATE写不进去,不能专注了...... /* */ ------------------------------------------------- ...

  6. python反向遍历一个可迭代对象

    我们通常情况下都是正向遍历一个列表,下面是一种简单的反向遍历一个列表的方式. ## 正向遍历 >>>A = [9, 8, 7] >>>for index, a in ...

  7. 恕我直言你可能真的不会java第2篇:Java Stream API?

    一.什么是Java Stream API? Java Stream函数式编程接口最初是在Java 8中引入的,并且与lambda一起成为Java开发的里程碑式的功能特性,它极大的方便了开放人员处理集合 ...

  8. Web前端 -- Webpack

    一.Webpack Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 二.Webpack安装 1.全局安装 npm i ...

  9. npm: no such file or directory, scandir '.../node_modules/node-sass/vendor'

    运行vue报错 npm run dev 解决办法,运行:npm rebuild node-sass

  10. Error: Cannot find module 'webpack'

    运行 npm start 报错 Error: Cannot find module 'webpack' 安装了 npm install --save-dev webpack cnpm install ...