Python封装原理与实现方法详解


Posted in Python onAugust 28, 2018

本文实例讲述了Python封装原理与实现方法。分享给大家供大家参考,具体如下:

【封装】

 隐藏对象的属性和实现细节,仅对外提供公共访问方式。

【好处】

1. 将变化隔离;

2. 便于使用;

3. 提高复用性;

4. 提高安全性;

【封装原则】

1. 将不需要对外提供的内容都隐藏起来;

2. 把属性都隐藏,提供公共方法对其访问。

私有变量和私有方法

在python中用双下划线开头的方式将属性隐藏起来(设置成私有的)

私有变量

#其实这仅仅这是一种变形操作
#类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式:
class A:
  __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N
  def __init__(self):
    self.__X=10 #变形为self._A__X
  def __foo(self): #变形为_A__foo
    print('from A')
  def bar(self):
    self.__foo() #只有在类内部才可以通过__foo的形式访问到.
#A._A__N是可以访问到的,即这种操作并不是严格意义上的限制外部访问,仅仅只是一种语法意义上的变形

这种自动变形的特点:

1.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果。

2.这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的。

3.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。

这种变形需要注意的问题是:

1.这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N

2.变形的过程只在类的定义是发生一次,在定义后的赋值操作,不会变形

私有方法

#正常情况
>>> class A:
...   def fa(self):
...     print('from A')
...   def test(self):
...     self.fa()
...
>>> class B(A):
...   def fa(self):
...     print('from B')
...
>>> b=B()
>>> b.test()
from B
#把fa定义成私有的,即__fa
>>> class A:
...   def __fa(self): #在定义时就变形为_A__fa
...     print('from A')
...   def test(self):
...     self.__fa() #只会与自己所在的类为准,即调用_A__fa
...
>>> class B(A):
...   def __fa(self):
...     print('from B')
...
>>> b=B()
>>> b.test()
from A

封装与扩展性

封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码;而外部使用用者只知道一个接口(函数),只要接口(函数)名、参数不变,使用者的代码永远无需改变。这就提供一个良好的合作基础——或者说,只要接口这个基础约定不变,则代码改变不足为虑。

#类的设计者
class Room:
  def __init__(self,name,owner,width,length,high):
    self.name=name
    self.owner=owner
    self.__width=width
    self.__length=length
    self.__high=high
  def tell_area(self): #对外提供的接口,隐藏了内部的实现细节,此时我们想求的是面积
    return self.__width * self.__length
#使用者
>>> r1=Room('卧室','egon',20,20,20)
>>> r1.tell_area() #使用者调用接口tell_area
400
#类的设计者,轻松的扩展了功能,而类的使用者完全不需要改变自己的代码
class Room:
  def __init__(self,name,owner,width,length,high):
    self.name=name
    self.owner=owner
    self.__width=width
    self.__length=length
    self.__high=high
  def tell_area(self): #对外提供的接口,隐藏内部实现,此时我们想求的是体积,内部逻辑变了,只需求修该下列一行就可以很简答的实现,而且外部调用感知不到,仍然使用该方法,但是功能已经变了
    return self.__width * self.__length * self.__high
#对于仍然在使用tell_area接口的人来说,根本无需改动自己的代码,就可以用上新功能
>>> r1.tell_area()
400

property属性

property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值

@property

@obj.setter

@obj.deleter

为什么要用property

将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python监控网卡流量并使用graphite绘图的示例
Apr 27 Python
学习python类方法与对象方法
Mar 15 Python
Python selenium 三种等待方式详解(必会)
Sep 15 Python
Python json模块dumps、loads操作示例
Sep 06 Python
Python Image模块基本图像处理操作小结
Apr 13 Python
使用Python的turtle模块画国旗
Sep 24 Python
python字典setdefault方法和get方法使用实例
Dec 25 Python
python 将视频 通过视频帧转换成时间实例
Apr 23 Python
关于Python字符编码与二进制不得不说的一些事
Oct 04 Python
Django celery异步任务实现代码示例
Nov 26 Python
详解matplotlib绘图样式(style)初探
Feb 03 Python
python数据可视化使用pyfinance分析证券收益示例详解
Nov 20 Python
python 中文件输入输出及os模块对文件系统的操作方法
Aug 27 #Python
python中cPickle类使用方法详解
Aug 27 #Python
python散点图实例之随机漫步
Aug 27 #Python
python3.5绘制随机漫步图
Aug 27 #Python
Python反射和内置方法重写操作详解
Aug 27 #Python
Python使用matplotlib绘制随机漫步图
Aug 27 #Python
Python面向对象之继承和组合用法实例分析
Aug 27 #Python
You might like
一个基于PDO的数据库操作类(新) 一个PDO事务实例
2011/07/03 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
php compact 通过变量创建数组
2016/11/15 PHP
PHP实现的激活用户注册验证邮箱功能示例
2017/06/06 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
iis6+javascript Add an Extension File
2007/06/13 Javascript
JQuery 遮罩层实现(mask)实现代码
2010/01/09 Javascript
js页面跳转的问题(跳转到父页面、最外层页面、本页面)
2013/08/14 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
JS异步错误捕获的一些事小结
2019/04/26 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
微信小程序实现多行文字超出部分省略号显示功能
2019/10/23 Javascript
JavaScript命令模式原理与用法实例详解
2020/03/10 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
Python程序语言快速上手教程
2012/07/18 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
2018/03/23 Python
Johnson Fitness澳大利亚:高级健身器材
2021/03/16 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
物理教育专业毕业生推荐信
2013/11/03 职场文书
酒店执行总经理岗位职责
2013/12/15 职场文书
校园文化建设方案
2014/02/03 职场文书
学生会干部自荐信
2014/02/04 职场文书
大学生个人自荐信样本
2014/03/02 职场文书
高中生个性发展自我评价
2015/03/09 职场文书
学习商务礼仪心得体会
2016/01/22 职场文书
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技