一、 概述

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

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

二、对封装的理解

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

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

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. 前端-----css(1)

    css概述 CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. css知识点 注释 /* 注释内容 */ css四 ...

  2. oracle dblink的创建与使用

    一.什么是DBLINK dblink,顾名思义就是数据库的链接. 当我们要跨本地数据库访问另一个数据库中的表的数据时,在本地数据库中就必须要创建远程数据库的dblink,通过该dblink就可以达到访 ...

  3. macbook install mysql

    安装Homebrew,详细步骤参见Homebrew官网. brew doctor确认brew在正常工作. brew update更新包. brew install mysql 安装mysql.log如 ...

  4. k64 datasheet学习笔记4---Clock distribution

    1.前言 本文主要讲述K64时钟配置相关的内容. 2.clock overview 2.1 clock diagram 2.2 对clock diagram的信号说明 (1)MCG决定哪个clock ...

  5. java.lang.StackOverflowError 解决方法

    ♦ java.lang.StackOverflowError : 由于深度递归,抛出此错误以指示应用程序的堆栈已耗尽. 在递归中,一个方法在执行期间调用自己.递归被认为是一种强大的通用编程技术,但必须 ...

  6. Mudo C++网络库第三章学习笔记

    多线程服务器的适用场合与常用编程模型 进程间通信与线程同步; 以最简单规范的方式开发功能正确.线程安全的多线程程序; 多线程服务器是指运行在linux操作系统上的独占式网络应用程序; 不考虑分布式存储 ...

  7. (转!)利用Keras实现图像分类与颜色分类

    2018-07-19 全部谷歌渣翻加略微修改 大家将就的看哈 建议大佬们还是看看原文 点击收获原文 其中用到的示例文件 multi-output-classification 大家可以点击 下载 . ...

  8. <杂记>Android Studio 3.0-3.1 汉化包 (转载)

    JetBrains 系列软件汉化包 关键字: Android Studio 3.0-3.1 汉化包 CLion 2018.1 汉化包 GoLand 2017.3.2-2018.1 汉化包 Intell ...

  9. ios中input获取焦点时的问题

    1.获取焦点时,input会变大 解决办法是:font-size设置为32px以上 还有就是要在header里面加这一行代码:<meta name="viewport" co ...

  10. Confluence 6 查看你的许可证细节

    希望查看你的 Confluence 许可证: 进入  > 基本配置(General Configuration). 在左侧的面板中选择 许可证详细(License Details). 你的许可证 ...