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 Person:
- __key = 123 # 私有静态属性
- def __init__(self,name,passwd):
- self.name = name
- self.__passwd = passwd # 私有属性
- def __get_pwd(self): # 私有方法
- return self.__passwd #只要在类的内部使用私有属性,就会自动的带上_类名
- def login(self): # 正常的方法调用私有的方法
- self.__get_pwd()
- alex = Person('alex','alex3714')
- print(alex._Person__passwd) # _类名__属性名
- print(alex.get_pwd())
- 所有的私有 都是在变量的左边加上双下划綫
结合练习
封装与扩展性
封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码;而外部使用用者只知道一个接口(函数),只要接口(函数)名、参数不变,使用者的代码永远无需改变。这就提供一个良好的合作基础——或者说,只要接口这个基础约定不变,则代码改变不足为虑。
- #类的设计者
- 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
- #类的设计者,轻松的扩展了功能,而类的使用者完全不需要改变自己的代码
- 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()
python之路----面向对象的封装特性的更多相关文章
- 百万年薪python之路 -- 面向对象之三大特性
1.面向对象之三大特性 1.1封装 封装:就是把一堆代码和数据,放在一个空间,并且可以使用 对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封 ...
- python之路----面向对象的多态特性
多态 多态指的是一类事物有多种形态 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.abstr ...
- python之路----面向对象的继承特性
继承 什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 class ...
- Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)
Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...
- python之路 面向对象基础 XML
一.面向对象基础 1.类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义 ...
- 【python之路面向对象】初级篇
概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...
- python学习day19 面向对象(一)封装/多态/继承
面向对象 封装思想:将同一类的函数函数封装到同一个py文件中,方便调用 面向对象也有封装的作用,将同一类的函数封装到一个类中 多态(鸭子模型):多种类型/多种形态 #,什么事鸭子模型 对于一个函数,p ...
- python之路---面向对象编程(二)
类的继承 1.在python3中,只有新式类,新式类的继承方式为:广度优先.而python2中,经典类的继承方式为:深度优先.那么我们来看看深度优先和广度优先的区别吧 如下图,为类之间的继承关系.B, ...
- python之路----面向对象中的内置函数
property属性 什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法 ...
随机推荐
- 【转载】纵观RTX51
对于使用RTX51的具体好处可以在实践中去体会,就象会用了C51,就不想再用汇编了.用了RTX51,说不定就感到再也离不开它了. 1.RTX51是实时多任务操作系统RTX51是一种实时操作系统既目前在 ...
- HTTP协议的前世今生——各版本HTTP协议对比
HTTP协议是如今互联网与服务端技术的基石,HTTP协议的演进也从侧面反应了互联网技术的快速发展.这两天在准备一次关于HTTP1.1协议特性的技术分享过程中,顺便了解了下各版本HTTP协议的特点,在这 ...
- POJ_1050_To the Max
To the Max Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 49811 Accepted: 26400 Desc ...
- 表优化 altering table OPTIMIZE TABLE `sta_addr_copy`
表优化 altering table OPTIMIZE TABLE `sta_addr_copy` [总结] 1.实际测试的结果是,在state sqlaltering table OPTIMIZE ...
- cdn,wsgi框架
CDN:分布式服务器 wsgi:http请求----wsgi----web框架
- 01 - nginx - 安装、配置文件、默认网站、虚拟主机
一.运维: . 介绍服务器. 服务器逻辑: 服务器选择 操作系统 部署逻辑 业务环境部署逻辑 业务部署图 软件部署文档 日常维护文档 测试 开发上传代码到源码系统 上线 - 测服务器,内测 预发布测试 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- js判断字符串长度
方法1: String.prototype.gblen = function() { var len = 0; for (var i=0; i<this.length; i++) { if (t ...
- [python-opencv]超大图像二值化方法
*分块 *全局阈值 VS 局部阈值 import cv2 as cv import numpy as np def big_image_binary(image): print(image.shape ...
- Linux下设置python脚本文件为服务
(最简单的方式nohup python xxx.py) ------------------------------------------------------------------------ ...