一、 概述

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

封装的原则:把不需要对外提供的内容都隐藏起来,提供公共的方法访问这些隐藏属性

二、对封装的理解

  • 归类,将类的相关功能函数封装到类里
  • 打包,将一些数据封装到类或者对象中

使用双下划线将属性和方法隐藏起来

class Person:
__role = 'person' # 定义类的私有属性
def __init__(self,name,password):
self.name = name
self.__password = password # 定义对象私有属性
def __getPwd(self): # 定义
对象的私有方法
return self.__password
def login(self): # 定义公共的方法进行属性房本
password = self.__getPwd()
print(password) wangys = Person('wangys','')
print(Person.__dict__)
# '_Person__role': 'person', '_Person__getPwd': <function Person.__getPwd at 0x000001D5575AE1E0>
# 类的私有静态属性由__属性 变形 _类命__属性,方法也是一样 ##### 类的静态私有属性
## 使用类调用静态属性
# 通过类直接掉私有属性会报错,报错内容是没有这个私有属性
print(Person.__role)
# 结果:AttributeError: type object 'Person' has no attribute '__role' 报错
# 通过调用变形后的私有属性,可以正常调用
print(Person._Person__role)
# 结果: person ## 通过对象进行调用静态属性(与类一样)
print(wangys.__role)
print(wangys._Person__role)
# AttributeError: 'Person' object has no attribute '__role'
# person ####### 私有属性
print(wangys.__dict__)
# {'name': 'wangys', '_Person__password': '123'}
# ### 通过对象在外部进行调用私有属性
print(wangys.name)
print(wangys.__password)
print(wangys._Person__password)
# 结果:wangys
# 结果: AttributeError: 'Person' object has no attribute '__password'
# 结果:123
# 私有属性,在类外部调用时,不能直接调用。 ##### 私有方法
print(wangys.__getPwd)
# AttributeError: 'Person' object has no attribute '__getPwd'
print(wangys._Person__getPwd)
# <bound method Person.__getPwd of <__main__.Person object at 0x000001D4BB8FDA58>>
# 外部调用不能直接调用,可以调用变形后的属性 # 使用公共方法访问私有属性
wangys.login()
#
# 类内部可以直接调用私有属性 # 结论:
# 私有属性和方法会变形,类内部可以调用,类外部不能直接调用,可以使用公共的方法调用这些私有属性,通过字典的方式查看,属性并没有被隐藏,但是属性的名称做了变形
# 类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果
# 在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。
# 这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N
# 变形的过程只在类的内部生效,在定义后的赋值操作,不会变形,也就说不能在类外部定义私有属性
# 如果父类和子类有同样的方法,子类对象在调用这个方法时,调用的是子类的方法
class Anmimal:
def __walk(self):
print('Animal is walking')
def test(self):
self.__walk() class Person(Anmimal):
def __walk(self):
print('Person is walking')
def test(self):
self.__walk()
wangys = Person()
wangys.test() # 如果是私有属性
class Anmimal:
def __walk(self):
print('Animal is walking')
def test(self):
self.__walk() class Person(Anmimal):
def __walk(self):
print('Person is walking') wangys = Person()
wangys.test()

python面向对象三大特性之封装的更多相关文章

  1. python面向对象三大特性之一封装

    一.什么是封装 在程序设计中,封装(Encapsulation)是对具体对象的一种抽象,即将某些部分隐藏起来,在程序外部看不到,其 含义是其他程序无法调用. 要了解封装,离不开“私有化”,就是将类或者 ...

  2. python 面向对象三大特性(封装 多态 继承)

    今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...

  3. python 面向对象(三大特性)

    python 面向对象(初级) (思维导图 ↑↑↑↑↑) 概述: 面向过程:根据业务逻辑从上到下垒代码. 函数式:将某功能代码封装至函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类 ...

  4. python面向对象三大特性

    面向对象的三大特性: 封装.继承和多态 一.封装 封装,顾名思义就是将内容封装到某个地方,以后可以直接调用被封装到某处的内容. - 将内容封装到某处 - 从某处调用被封装的内容 第一步,将内容封装到某 ...

  5. JAVA基础——面向对象三大特性:封装、继承、多态

    JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据. ...

  6. Javascript面向对象三大特性(封装性、继承性、多态性)详解及创建对象的各种方法

    Javascript基于对象的三大特征和C++,Java面向对象的三大特征一样,都是封装(encapsulation).继承(inheritance )和多态(polymorphism ).只不过实现 ...

  7. python面向对象-三大特性

    python面向对象编程三大特性 小结:前面我们说完了类和对象的关系,相信对类和对象的理解更加透彻..让我们一起去研究面向对象的三大特性吧.... 继承 1.什么继承? 在程序中继承就是事物之间的所属 ...

  8. python面向对象三大特性之一继承、多态、封装

    继承,即在定义一个类时,以另一个类为参数,则称这个新定义的类继承了参数类,父类又称为基类. 单继承表示只继承一个类,多继承表示继承多个类. class parent1: pass class pare ...

  9. Python()- 面向对象三大特性----封装

    封装: [封装]         隐藏对象的属性和实现细节,仅对外提供公共访问方式.[好处] 1. 将变化隔离: 2. 便于使用:3. 提高复用性: 4. 提高安全性:[封装原则]      1. 将 ...

随机推荐

  1. vue工具知识

    1.访问数据自动格式化 Google jsonview插件(已用) 2.字体图标库. https://icomoon.io/  上传svg可生成字体图标

  2. Django实战(一)-----用户登录与注册系统5(图片验证码)

    为了防止机器人频繁登录网站或者破坏分子恶意登录,很多用户登录和注册系统都提供了图形验证码功能. 验证码(CAPTCHA)是一种区分用户是计算机还是人的公共全自动程序. 可以防止恶意破解密码.刷票.论坛 ...

  3. 第四节:tensorflow图的基本操作

    基本使用 使用图(graph)来表示计算任务 激活会话(Session)执行图 使用张量(tensor)表示数据 定义变量(Variable) 使用feed可以任意赋值或者从中获取数据,通常与占位符一 ...

  4. 2018 Multi-University Training Contest 1 杭电多校第一场

    抱着可能杭电的多校1比牛客的多校1更恐怖的想法 看到三道签到题 幸福的都快哭出来了好吗 1001  Maximum Multiple(hdoj 6298) 链接:http://acm.hdu.edu. ...

  5. LwIP Application Developers Manual3---链路层和网络层协议之ARP,IPV4

    1.前言 本文主要讲述链路层和网络层的几种协议:ARP,ipv4 2. ARP 2.1 ARP的主要应用 ARP的主要应用是在与互联网相连的以太网网络层,该层需要一些机制将MAC地址(该地址主要由制造 ...

  6. qemu中使用9p,支持host和guest中共享目录【转】

    转自:https://blog.csdn.net/ayu_ag/article/details/52956351 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...

  7. PEP 530 -- 异步推导式

    PEP 530 -- 异步推导式 摘要 PEP 492和PEP 525使用async/await语法引入了协程.PEP 530建议添加list,set,dict推导式和生成器推导式的异步版本. 理论和 ...

  8. java官网真不错

    要用到一个软件,打开时说没找到javaw,然后大家说这是因为没安装java,就按着链接去了java官网 https://www.java.com/zh_CN/download/faq/remove_o ...

  9. python3+selenium框架设计09-生成测试报告

    使用HTMLTestRunner可以生成测试报告.HTMLTestRunner是unittest模块下的一个拓展,原生的生成报告样式比较丑,GitHub上有大佬优化过后的版本:GitHub地址.下载之 ...

  10. nodejs+express+mongodb简单的例子

    简单的介绍下node+express+mongodb这三个东西.node:是运行在服务器端的程序语言,表面上看过去就是javascript一样的东西,但是呢,确实就是服务器语言,个人觉得在一定层次上比 ...