一、 概述

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

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

二、对封装的理解

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

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

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. Lock类-ReentrantLock的使用

    在Java多线程中可以使用synchronized隐式锁实现线程之间同步互斥,Java5中提供了Lock类(显示锁)也可以实现线程间的同步,而且在使用上更加方便.本文主要研究 ReentrantLoc ...

  2. oracle12.2.1 坑

    1.ORA-28040: No matching authentication protocol 解决:在Oracle用户(不是grid用户)下,将$ORACLE_HOME/network/admin ...

  3. with语法

    上下文管理协议 要使用 with 语句,首先要明白上下文管理器这一概念.有了上下文管理器,with 语句才能工作. 下面是一组与上下文管理器和with 语句有关的概念. 上下文管理协议(Context ...

  4. jquery获取浏览器URL参数

    getRequestParams:function(param){ var reg = new RegExp("(^|&)" + param + "=([^&am ...

  5. 解决FTPClient上传文件为空,显示0字节

    JAVA使用FTPClient上传文件时总是为空,而使用FileZilla客户端时却不会. 后来查了下资料,FTP服务器有被动模式和主动模式.(具体查另外资料) 在JAVA中将FTPClient设置为 ...

  6. Java RMI与RPC的区别

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6542811.html  一:RPC 远程过程调用 RPC(Remote Procedure Call Prot ...

  7. Solidity(address的四个方法)

    address的四个方法send,call,callcode,delegatecall 例子:发送以太币的send方法//下面是send方法,涉及到以太币的情况可能用到payable,senddemo ...

  8. 45)django-分页实现

    Django提供了一个新的类来帮助你管理分页数据,.它可以接收列表.元组或其它可迭代的对象. 一:常用方法 >>> from django.core.paginator import ...

  9. centos6.5 有趣但是没有用的linux命令

    小火车 get http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm rpm -ivh epel-rele ...

  10. 在java中,OOA是什么?OOD是什么?OOP是什么?

    注:本文来源于<   在java中,OOA是什么?OOD是什么?OOP是什么?> 在java中,OOA是什么?OOD是什么?OOP是什么? OOA Object-Oriented Anal ...