python面向对象三大特性之封装
一、 概述
定义:隐藏对象的属性和实现细节,仅对外提供公共访问方式
封装的原则:把不需要对外提供的内容都隐藏起来,提供公共的方法访问这些隐藏属性
二、对封装的理解
- 归类,将类的相关功能函数封装到类里
- 打包,将一些数据封装到类或者对象中
使用双下划线将属性和方法隐藏起来
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面向对象三大特性之封装的更多相关文章
- python面向对象三大特性之一封装
一.什么是封装 在程序设计中,封装(Encapsulation)是对具体对象的一种抽象,即将某些部分隐藏起来,在程序外部看不到,其 含义是其他程序无法调用. 要了解封装,离不开“私有化”,就是将类或者 ...
- python 面向对象三大特性(封装 多态 继承)
今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...
- python 面向对象(三大特性)
python 面向对象(初级) (思维导图 ↑↑↑↑↑) 概述: 面向过程:根据业务逻辑从上到下垒代码. 函数式:将某功能代码封装至函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类 ...
- python面向对象三大特性
面向对象的三大特性: 封装.继承和多态 一.封装 封装,顾名思义就是将内容封装到某个地方,以后可以直接调用被封装到某处的内容. - 将内容封装到某处 - 从某处调用被封装的内容 第一步,将内容封装到某 ...
- JAVA基础——面向对象三大特性:封装、继承、多态
JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据. ...
- Javascript面向对象三大特性(封装性、继承性、多态性)详解及创建对象的各种方法
Javascript基于对象的三大特征和C++,Java面向对象的三大特征一样,都是封装(encapsulation).继承(inheritance )和多态(polymorphism ).只不过实现 ...
- python面向对象-三大特性
python面向对象编程三大特性 小结:前面我们说完了类和对象的关系,相信对类和对象的理解更加透彻..让我们一起去研究面向对象的三大特性吧.... 继承 1.什么继承? 在程序中继承就是事物之间的所属 ...
- python面向对象三大特性之一继承、多态、封装
继承,即在定义一个类时,以另一个类为参数,则称这个新定义的类继承了参数类,父类又称为基类. 单继承表示只继承一个类,多继承表示继承多个类. class parent1: pass class pare ...
- Python()- 面向对象三大特性----封装
封装: [封装] 隐藏对象的属性和实现细节,仅对外提供公共访问方式.[好处] 1. 将变化隔离: 2. 便于使用:3. 提高复用性: 4. 提高安全性:[封装原则] 1. 将 ...
随机推荐
- linux系统内核版本升级
一.查看Linux内核版本命令(2种方法): 1.cat /proc/version 2.uname -a 二.查看Linux系统版本的命令(3种方法): 1.lsb_release -a 即可列出所 ...
- python 获取本机IP的三种方式
python获取本机IP的方式 第一种: #!/usr/bin/python import socket import fcntl import struct def get_ip_address(i ...
- Wireshark技巧-过滤规则和显示规则【转】
转自:https://www.cnblogs.com/icez/p/3973873.html Wireshark是一个强大的网络协议分析软件,最重要的它是免费软件. 过滤规则 只抓取符合条件的包,在W ...
- HTTP协议02-请求和响应的报文构成
HTTP协议和TCP/IP协议族内的其他众多协议相同,用于客户端与服务器之间的通信,请求访问文本或图像等资源的一端+称为客户端,而提供资源响应的一端称为服务端. 应用HTTP协议时,请求必定是客户端发 ...
- boost::function 介绍
本片文章主要介绍boost::function的用法. boost::function 就是一个函数的包装器(function wrapper),用来定义函数对象. 1. 介绍 Boost.Func ...
- FTP服务器基础设定
1.安装vsftpd文件服务器 sudo apt-get install vsftpd 2.配置文件:/etc/vsftpd/vsftpd.conf 严格来说,整个 vsftpd 的配置文件就只有这个 ...
- 题解 SP26045 【GCDMAT2 - GCD OF MATRIX (hard)】
承接一下洛咕上的题解,这里基本就是谈谈优化,放个代码的 我们发现这里的常数主要来自于除法,那么我们优化除法次数,把所有的 \(n/1...n/s\) (\(s=\sqrt n\))存下来,然后归并排( ...
- 021_nginx动态upstream检查
GET: 请求指定的页面信息,并返回实体主体.HEAD: 只请求页面的首部. #参考:http://tengine.taobao.org/document_cn/http_upstream_check ...
- signal & slot
The Qt signals/slots and property system are based on the ability to introspect the objects at runti ...
- Laravel 5.2--git冲突error: Your local changes to the following files would be overwritten by merge:
今天在服务器上git pull是出现以下错误: error: Your local changes to the following files would be overwritten by mer ...