一、什么是封装

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

封装<==>整合

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

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

最新文章

  1. sql monitor生成不了报告&amp; FFS hint不生效两个问题思考
  2. Linux 命令 创建文件
  3. c语言小知识点
  4. Trie字典树 静态内存
  5. React Native实践之携程Moles框架
  6. python 遍历删除日志
  7. Spark RDD概念学习系列之RDD与DSM的异同分析(十三)
  8. Android实例-调用GOOGLE的TTS实现文字转语音(XE7+小米2)(无图)
  9. qwt6在Windows下Qt5的编译,安装,初步使用
  10. java中json和字符串互转及日期转换 练习
  11. C &quot;right-left&quot; 从左到右
  12. Office远程代码执行漏洞(CVE-2017-11882)复现
  13. jdbc中的sql注入
  14. tiny6410 启动参数
  15. inline temp 内联临时变量
  16. February 16th, 2018 Week 7th Friday
  17. 四则运算APP
  18. Scala字符串插值
  19. CAC的Debian-8-64bit安装BBR正确方式是?
  20. This kernel requires an x86-64 CPU, but only detected an i686 CPU.

热门文章

  1. 朋友,您可能是MCR的受害者
  2. char 型变量中能不能存贮一个中文汉字?为什么?
  3. 168.Excel列表名称
  4. 包子凑数(dp 0-1、完全背包)【背包问题】
  5. WEditor(元素定位工具)安装和定位界面元素
  6. Jmeter(十) - 从入门到精通 - JMeter逻辑控制器 - 中篇(详解教程)
  7. redis性能优化——生产中实际遇到的问题排查总结
  8. Java 从入门到进阶之路(二十四)
  9. AWS 错误标记3
  10. npm 更换镜像,解决cnpm仍然太慢的问题