我们家里都有电视机,从开机,浏览节目,换台到关机,我们不需要知道电视机里面的具体细节,只需要在用的时候按下遥控器就可以完成操作,这就是功能的封装。

在用支付宝进行付款的时候,只需要在用的时候把二唯码给收款方或是扫一下收款方提供的二唯码就可以完成支付,不需要知道支付宝的支付接口,以及后台的处理数据的能力,这就是方法的封装。

生活中处处都是封装的概念。
封装不是单纯意义的隐藏
封装数据的主要原因是保护隐私
封装方法的主要有因是隔离复杂度

在编程语言里,对外提供接口,表示这个接口的函数,通常称为接口函数。

封装分为两个层面:

第一层面的封装:创建类和对象时,分别创建两者的名称空间。只能通过类名加“.”或者obj.的方式访问里面的名字第二层面的封装,类中把某些属性和方法隐藏起来,或者定义为私有,只在类的内部使用,在类的外部无法访问,或者留下少量的接口(函数)供外部访问

但无论是哪种层面的封装,都要对外提供好访问内部隐藏内容的接口。

在python中,使用双下划线的方式实现隐藏属性(设置成私有属性)。

在python中,隐藏类的属性用什么办法呢??

来看下面的例子:

class Teacher:def __init__(self,name,age,course):self.name=nameself.age=ageself.course=coursedef teach(self):print("%s is teaching"%self.name)class Student:def __init__(self,name,age,group):self.name=nameself.age=ageself.group=groupdef study(self):print("%s is studying"%self.name)

用所定义的类创建一个老师s1和一个学生s1。

t1=Teacher("alex",28,"python")
s1=Student("jack",22,"group2")

分别调用老师和学生的姓名,年龄等特征:

print(t1.name,t1.age,t1.course)
print(s1.name,s1.age,s1.group)

返回如下的信息:

alex 28 python
jack 22 group2

调用老师的教书技能和学生的学习技能:

t1.teach()
s1.study()

返回信息如下:

alex is teaching
jack is studying

把这两类中的一些属性隐藏起来后,代码如下:

class Teacher:def __init__(self,name,age,course):self.__name=nameself.__age=ageself.__course=coursedef teach(self):print("%s is teaching"%self.__name)class Student:def __init__(self,name,age,group):self.__name=nameself.__age=ageself.__group=groupdef study(self):print("%s is studying"%self.__name)

创建老师和学生的实例:

t1=Teacher("alex",28,"python")
s1=Student("jack",22,"group2")

再用前面一样的方法调用老师和学生的特征:

print(t1.name,t1.age,t1.course)
print(s1.name,s1.age,s1.group)

此时这样调用就会报错,输出信息如下所示:

Traceback (most recent call last):File "E:/py_code/oob.py", line 114, in <module>print(t1.name,t1.age,t1.course)
AttributeError: 'Teacher' object has no attribute 'name

再调用老师的教书技能和学生的学习技能:

t1.teach()
s1.study()

返回信息如下:

alex is teaching
jack is studying

可以看到隐藏属性后,再像以前那样访问对象内部的属性,就会返回属性错误,那现在要怎么才能访问其内部属性呢?
现在来查看t1和s1的名称空间

print(t1.__dict__)
{'_Teacher__name': 'alex', '_Teacher__age': 28, '_Teacher__course': 'python'}
print(s1.__dict__)
{'_Student__name': 'jack', '_Student__age': 22, '_Student__group': 'group2'}

可以看到t1和s1的名称空间完全改变了,现在访问t1名称空间里的key,可以看到什么呢??

print(t1._Teacher__name)
print(t1._Teacher__age)
print(t1._Teacher__course)

返回如下:

alex
28
python

这次没有报错了,看来隐藏属性之后可以通过"_类名__属性"的方式来访问其内部的属性值,
来得到和隐藏属性之前,直接查看其内部属性一样的值。

python对于这样的隐藏,有一些特点:
1.类中定义的_X吸能在内部使用,如self._X,引用的就是变形之后的结果。
2.这种变形其实正是对外部的改变,在外部是无法通过_X这个名字访问到的。

事实上,python对于这一层面的封装,需要在类中定义一个函数。
这样在类的内部访问被隐藏的属性,在外部就可以使用了,而且这种形式的隐藏并没有
真正意义上的限制从外部直接访问属性,知道了类名和属性名一样可以调用类的隐藏属性。

python并不会真的阻止开发人员访问类的私有属性,模块也是遵循这种约定。
很多模块都有以单下划线开头的方法,此时使用

from module import *

时,这些方法是不会被导入的,此时必须要通过

from module import _private_module

来导入这种类型的模块。

转载于:https://www.cnblogs.com/renpingsheng/p/7133770.html

浅谈python的对象的三大特性之封装相关推荐

  1. java-面向对象编程-三大特性之封装

    我们在上一章中谈到了面向对象编程的三大特性之一的继承.并且说到在继承中,父类其实是从子类中抽象出来的,而在这里所说的抽象,就可以理解为数据封装的一种表达方式.而准确来说,所谓的封装,就是在人为对客观事 ...

  2. 经过前面几天的学习已经把对象的三大特性之一封装学完了现在开始学习接下来的继承和多态

    继承: 1.继承的概述 **继承在java中指的是"一个类"可以"继承自""另一个类". "被继承的类"叫做: 父类/超 ...

  3. python中对象的特性_python中类与对象之继承,python类和对象理解,面对对象的三大特性之...

    python中类与对象之继承,python类和对象理解,面对对象的三大特性之 面对对象的三大特性之继承 1.什么是继承? 在程序中,继承指的是class与class之间的关系 继承是一种关系,必须存在 ...

  4. python类中方法的执行顺序-浅谈Python的方法解析顺序(MRO)

    方法解析顺序, Method Resolution Order 从一段代码开始 考虑下面的情况: class A(object): def foo(self): print('A.foo()') cl ...

  5. python方法解析顺序_浅谈Python的方法解析顺序(MRO)

    方法解析顺序, Method Resolution Order 从一段代码开始 考虑下面的情况: class A(object): def foo(self): print('A.foo()') cl ...

  6. python 读excel字符型 数值_浅谈python 读excel数值为浮点型的问题

    浅谈python 读excel数值为浮点型的问题 如下所示: #读入no data = xlrd.open_workbook("no.xlsx") #打开excel table = ...

  7. python hasattr函数_浅谈python中的getattr函数 hasattr函数

    hasattr(object, name) 作用:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的). 示例: & ...

  8. python中内置的四种数值类型为_浅谈python语言四种数值类型

    Python语言支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下.希望对 ...

  9. python中文字符串编码_浅谈python下含中文字符串正则表达式的编码问题

    前言 Python文件默认的编码格式是ascii ,无法识别汉字,因为ascii码中没有中文. 所以py文件中要写中文字符时,一般在开头加 # -*- coding: utf-8 -*- 或者 #co ...

最新文章

  1. ORACLE设置用户密码不过期
  2. oracle tranc,oracle函数trunc的使用
  3. js代码计算济南出租车打车费用
  4. mysql uroot e_批量 kill mysql 连接
  5. html5游戏制作入门系列教程(七)
  6. 【AD】取消普通域用户帐号加域权限授权特定普通域用户加域权限
  7. 【246天】跃迁之路——程序员高效学习方法论探索系列(实验阶段04-2017.10.09)...
  8. java实现PNG图片任意角度旋转
  9. xposed 修改手机定位
  10. 获取 pdf 中某个 关键字的位置
  11. [INFO] Using ‘UTF-8‘ encoding to copy filtered resources.错误
  12. Larval安装使用Excel步骤
  13. js实现整体,局部刷新
  14. 2011 我们的七夕
  15. ElasticSearch必知必会-基础篇
  16. 转:Excel Web Access Web Part
  17. 实战!Python常见的几种数据可视化案例
  18. filter 拦截器 获取http请求参数
  19. 关于点云数据的包围盒的方法总结
  20. css水平垂直居中(不定高)的三种方法

热门文章

  1. SSIS中循环遍历组件[Foreach Loop Container]
  2. [转]SQL Server 索引基础知识(2)----聚集索引,非聚集索引
  3. Andlinux 使用记录(转)
  4. Ubuntu14.04 更新源 方法 提升更新的下载速度
  5. gitee最多上传多大文件_H5移动端图片压缩上传,基于Jquery的前端,实现拍照上传,选择相册
  6. mysql性能调优与架构设计 51cto_MySQL 数据库性能优化之表结构优化
  7. python识别人脸多种属性_人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门...
  8. linux如何修改网卡序号,CentOS双网卡时改变网卡编号和配置静态路由的方法
  9. 客户端证书错误避坑指南
  10. 一篇文章教会你使用html+css3制作GIF图