浅谈python的对象的三大特性之封装
我们家里都有电视机,从开机,浏览节目,换台到关机,我们不需要知道电视机里面的具体细节,只需要在用的时候按下遥控器就可以完成操作,这就是功能的封装。
在用支付宝进行付款的时候,只需要在用的时候把二唯码给收款方或是扫一下收款方提供的二唯码就可以完成支付,不需要知道支付宝的支付接口,以及后台的处理数据的能力,这就是方法的封装。
生活中处处都是封装的概念。
封装不是单纯意义的隐藏
封装数据的主要原因是保护隐私
封装方法的主要有因是隔离复杂度
在编程语言里,对外提供接口,表示这个接口的函数,通常称为接口函数。
封装分为两个层面:
第一层面的封装:创建类和对象时,分别创建两者的名称空间。只能通过类名加“.”或者obj.的方式访问里面的名字
第二层面的封装,类中把某些属性和方法隐藏起来,或者定义为私有,只在类的内部使用,在类的外部无法访问,或者留下少量的接口(函数)供外部访问
但无论是哪种层面的封装,都要对外提供好访问内部隐藏内容的接口。
在python中,使用双下划线的方式实现隐藏属性(设置成私有属性)。
在python中,隐藏类的属性用什么办法呢??
来看下面的例子:
class Teacher:
def __init__(self,name,age,course):
self.name=name
self.age=age
self.course=course
def teach(self):
print("%s is teaching"%self.name)
class Student:
def __init__(self,name,age,group):
self.name=name
self.age=age
self.group=group
def 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=name
self.__age=age
self.__course=course
def teach(self):
print("%s is teaching"%self.__name)
class Student:
def __init__(self,name,age,group):
self.__name=name
self.__age=age
self.__group=group
def 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
来导入这种类型的模块。
浅谈python的对象的三大特性之封装的更多相关文章
- 浅谈python的对象的三大特性之继承
前面我们定义了人的类,并用这个类实例化出两个人jack和lily,查看了它们的内存空间. 现在我们再来看看类中所存在的对向对象编程的三大特性之继承的一些特性. 前面定义了一个人的类,可是我们还知道,人 ...
- 对象的三大特性(封装、继承、多态)——java
一. 面向对象的三大特征 1. 封装---->减少了大量的冗余代码---->封装将复杂的功能封装起来,对外开放一个接口,简单调用即可.将描述事物的数据和操作封装在一起,形成一个类:被封装的 ...
- python面向对象(类和对象及三大特性)
类和对象是什么 创建类 新式类 和 经典类 面向对象三大特性 继承 封装 多态 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- C#核心基础--浅谈类和对象的概念
浅谈类和对象的概念 一.什么是类?什么是对象? 学习一门面向对象编程语言,我们必须得知道什么是类?什么是对象? 类(Class)实际上是对某种类型的对象定义变量和方法的原型.它表示对现实生活中一类具有 ...
- 浅谈python字符串存储形式
http://blog.csdn.net/zhonghuan1992 钟桓 2014年8月31日 浅谈python字符串存储形式 记录一下自己今的天发现疑问而且给出自己现有知识有的回答. 长话短说,用 ...
- 开发技术--浅谈Python函数
开发|浅谈Python函数 函数在实际使用中有很多不一样的小九九,我将从最基础的函数内容,延伸出函数的高级用法.此文非科普片~~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点 ...
- Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)
Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...
- 浅谈Python时间模块
浅谈Python时间模块 今天简单总结了一下Python处理时间和日期方面的模块,主要就是datetime.time.calendar三个模块的使用.希望这篇文章对于学习Python的朋友们有所帮助 ...
- 浅谈Python在信息学竞赛中的运用及Python的基本用法
浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...
随机推荐
- HashMap 源码详细分析(JDK1.8)
一.概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值, ...
- bzoj:1661 [Usaco2006 Nov]Big Square 巨大正方形
Description 农民 John 的牛参加了一次和农民 Bob 的牛的竞赛.他们在区域中画了一个N*N 的正方形点阵,两个农场的牛各自占据了一些点.当然不能有两头牛处于同一个点.农场的目标是用自 ...
- Gym100814B Gym100814F Gym100814I(异或) ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology
今日份的训练题解,今天写出来的题没有昨天多,可能是因为有些事吧... Gym100814B 这个题就是老师改卷子,忘带标准答案了,但是他改了一部分卷子,并且确定自己改的卷子没出错,他想从改过的卷子里把 ...
- 客户端一致性与多Leader机制------《Designing Data-Intensive Applications》读书笔记7
接着上一篇的内容,我们继续来梳理分布式系统之中的副本机制与副本一致.上文我们聊到了在可用性与一致性之间的一个折中的一致性等级:最终一致性.我们顺着上篇的内容,由用户来分析一致性等级. 1. 客户端的困 ...
- js实现深拷贝和浅拷贝
浅拷贝: 思路----------把父对象的属性,全部拷贝给子对象,实现继承. 问题---------如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,不会开辟新栈,不是 ...
- [学习OpenCV攻略][017][ARM9下移植OpenCV]
安装环境 宿主机: Red Hat Enterprise Linux Server 6.3 开发板: mini2440 相关软件: cmake-3.5.1.tar.gz.OpenCV-2.3.1a.t ...
- SQL语句整理1
THEN '月卡' THEN '周卡' THEN '季度卡' THEN '年卡' ELSE '未知卡类型' END AS '卡类型' FROM SL_Register_Info Left join用法 ...
- [随笔] 简单操作解决Google chrome颜色显示不正常的情况
最近在用Linuxmint 真的是极友好的桌面Linux啊,然后用最新的Linuxmint自带的Firefox浏览器上网,发现颜色都变成了红色黄色变绿色,以为是显卡的问题,搞了一阵,无果.果断换Goo ...
- 使用vue框架运行npm run dev 时报错解决
使用使用vue框架运行npm run dev 时报错 如下: 原因: localhost:8080 有可能其他软件占用了,导致其他问题的出现 我们可以动态修改地址 解决: 进入项目文件的config文 ...
- 【开发技术】storyboard和nib的差别
在使用Storyboard管理的iOS应用中,它的组成部分为AppDelegate和ViewController这两个类以及MainStoryboard.storyboard文件组成.Storyboa ...