一、 概述

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

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

二、对封装的理解

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

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

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. requirements.txt文件教程

    方法有2种,命令都是一样,只是执行地方不一样 此方法主要用于迁移新环境使用,为防止代码出现问题,最好使用原装库,所以就有了迁移代码和库的操作 第一种:在pycharm中,左下角有个双重正方形,点击里面 ...

  2. springboot配置server相关配置&整合模板引擎Freemarker、thymeleaf&thymeleaf基本用法&thymeleaf 获取项目路径 contextPath 与取session中信息

    1.Springboot配置server相关配置(包括默认tomcat的相关配置) 下面的配置也都是模板,需要的时候在application.properties配置即可 ############## ...

  3. 识别oracle数据库软件版本号

    由于Oracle数据库不断发展并可能需要维护,因此Oracle会定期生成新版本.并非所有客户最初都订阅新版本或需要对其现有版本进行特定维护.因此,该产品的多个版本同时存在. 可能需要多达五个数字才能完 ...

  4. [转] 一文弄懂神经网络中的反向传播法——BackPropagation

    在看CNN和RNN的相关算法TF实现,总感觉有些细枝末节理解不到位,浮在表面.那么就一点点扣细节吧. 这个作者讲方向传播也是没谁了,666- 原文地址:https://www.cnblogs.com/ ...

  5. 【转】Python基础-封装与扩展、静态方法和类方法

    [转]Python基础-封装与扩展.静态方法和类方法 一.封装与扩展 封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码:而外部使用者只知道一个接口(函数),只要接口(函数 ...

  6. 多线程内存问题分析之mprotect方法【转】

    转自:https://blog.csdn.net/agwtpcbox/article/details/53230664 http://www.yebangyu.org/blog/2016/02/01/ ...

  7. VB获取CAD属性值

    Dim myAcadApp As AutoCAD.AcadApplication, activeDoc As AutoCAD.AcadDocument, acMS As AutoCAD.AcadMod ...

  8. 【OpenCV】SIFT原理与源码分析:DoG尺度空间构造

    原文地址:http://blog.csdn.net/xiaowei_cqu/article/details/8067881 尺度空间理论   自然界中的物体随着观测尺度不同有不同的表现形态.例如我们形 ...

  9. Css样式压缩、美化、净化工具 源代码

    主要功能如下: /* 美化:格式化代码,使之容易阅读 */ /* 净化:将代码单行化,并去除注释 */ /* 压缩:将代码最小化,加快加载速度 */ /* 以下是演示代码 */ /*reset beg ...

  10. 8-Images

    HTML Image Tags Tag Description <img> Defines an image <map> Defines an image-map <ar ...