Python - 面向对象编程 - 公共属性、保护属性、私有属性
公共属性
在 Python 的类里面,所有属性和方法默认都是公共的
class PoloBlog:
# 公共属性
sum = 0 # 构造方法
def __init__(self, name):
self.name = name # 公共方法
def test(self):
...
但Python也可以设置受保护、私有类型的变量or方法
私有类型的属性、方法
- 在实际开发中,对象的某些属性或方法可能只希望在对象的内部被使用,而不希望在外部被访问到
- 私有属性:就是对象不希望公开访问的属性
- 私有方法:就是对象不希望公开访问的方法
定义方式,类图
在属性、方法名前加两个下划线就是私有属性、私有方法了

代码
# 私有属性、方法
class Person: # 构造方法
def __init__(self, name, age):
self.name = name
self.__age = age # 实例方法
def pinrtMsg(self):
print("name:", self.name, " age:", self.__age) # 私有方法
def __getAge(self):
print("age is ", self.__age) person = Person("小菠萝", 24)
# 直接调用私有属性、私有方法 - 会报错
print(person.__age)
print(person.__getAge) # 输出结果
print(person.__age)
AttributeError: 'Person' object has no attribute '__age' print(person.__getAge)
AttributeError: 'Person' object has no attribute '__getAge'
看看 Pycharm 的代码联想


压根不会联想,因为是私有属性、私有方法,不允许在对象外部被使用
通过公共方法访问私有属性
person = Person("小菠萝", 24)
person.printMsg()
# 输出结果
name: 小菠萝 age: 24
类属性私有化
# 类属性的私有化
class Person:
__sum = 0 @classmethod
def getSum(cls, num):
# 调用私有类方法
cls.__sumAdd(num)
print(cls.__sum) @classmethod
def __sumAdd(cls, num):
cls.__
重点
- 子类无法访问父类的私有变量、方法
- 私有变量只有本类的内部能直接调用
- But!外部真的不能访问吗?
伪私有属性和私有方法
- 其实 Python 中,并没有真正意义上的私有,仍然可以在外部访问私有属性、私有方法
- 因为,在给私有属性、方法命名时,实际是对名称做了一些特殊处理,使得外界无法访问到
- 处理方式:在名称前面加上 _类名 ,私有属性、方法就会变成 _类名__名称
# 间接调用
class Person:
__sum = 0 # 构造方法
def __init__(self, name):
self.__name = name # 私有方法
def __getName(self):
print("name is ", self.__name) # 调用类私有属性
print(Person._Person__sum) person = Person("小菠萝") # 调用私有属性
print(person._Person__name)
# 调用私有方法
person._Person__getName() # 输出结果
0
小菠萝
name is 小菠萝
无论是类对象还是实例对象,都可以通过 ._类名__名称 来调用私有属性、方法,这算是一种间接调用
受保护类型的属性、方法
- 受保护类型一般会称为:protect 属性,学过 Java 的应该都了解
- 在属性和方法前加一个下划线就是 protect 类型了,私有类型是两个下划线
# 受保护类型
class PoloBlog:
_sum = 0.0 # 构造方法
def __init__(self, name):
self._name = name # 保护方法
def _printName(self):
print(self._name) # 类方法
@classmethod
def _classMethod(cls):
print(cls._sum) blog = PoloBlog("小菠萝")
# 打印保护类型的类属性
print(PoloBlog._sum) # 打印保护类型的实例属性
print(blog._name) # 实例对象调用保护类型的实例方法
blog._printName() # 实例对象调用保护类型的类方法
blog._classMethod() # 类对象调用保护类型的类方法
PoloBlog._classMethod() # 输出结果
0.0
小菠萝
小菠萝
0.0
0.0
知识点
- 父类的 protect 属性,子类可以继承
- 实例对象、类对象都能直接调用 protect 属性、方法
总的来说,和公共变量没有什么特别大的区别
总结
无论是受保护型变量还是私有变量,其实在外部还是能访问的,所以并不能真正控制属性的访问权限
Python - 面向对象编程 - 公共属性、保护属性、私有属性的更多相关文章
- Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性
什么是对象和类 https://www.cnblogs.com/poloyy/p/15178423.html 什么是 Python 类.类对象.实例对象 https://www.cnblogs.com ...
- Python面向对象编程(下)
本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...
- Python 面向对象编程——访问限制
<无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...
- 图解python | 面向对象编程
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...
- python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
- Python 面向对象编程基础
Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...
- python面向对象编程学习
python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
随机推荐
- Maven BOM!拿来吧你
what BOM? BOM(Bill of Materials)是由Maven提供的功能,它通过定义一整套相互兼容的jar包版本集合, 使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包, ...
- 微信小程序云开发-数据条件查询
一.使用where条件查询 在.get()语句之前增加.where语句实现条件查询. 二.通过doc查询单条数据 1.使用doc来查询数据库中的单条数据 2.定义一个空对象,用来展示插叙到的单条数据 ...
- 【译】使用 Source Link 提高调试效率
有多少次你在调试器中追踪一个缺陷,通过代码,观察局部变量的值改变,当你碰壁--不是你所期待的值和你不能进入的方法,因为它来自类库或 .NET 框架本身:或者您设置了一个条件断点,等待检查某个值是如何设 ...
- QT从入门到入土(四)——多线程(QtConcurrent::run())
引言 在前面对Qt多线程(QThread)做了详细的分析:QT从入门到入土(四)--多线程(QThread) - 唯有自己强大 - 博客园 (cnblogs.com) 但是最近在做项目时候,要将一个函 ...
- css伪类(:before和:after)
:before和:after的作用就是在指定的元素内容(而不是元素本身)之前或者之后插入一个包含content属性指定内容的行内元素,最基本的用法如下: #example{ width:300p ...
- 探究Presto SQL引擎(1)-巧用Antlr
一.背景 自2014年大数据首次写入政府工作报告,大数据已经发展7年.大数据的类型也从交易数据延伸到交互数据与传感数据.数据规模也到达了PB级别. 大数据的规模大到对数据的获取.存储.管理.分析超出了 ...
- CreatFile打开驱动失败
使用 CreateFile(DRIVER_PATH, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_AT ...
- MapReduce框架原理-Writable序列化
序列化和反序列化 序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输. 反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存中的 ...
- HCNA Routing&Switching之STP端口状态、计时器以及拓扑变化
前文我们了解了STP选举规则相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15131999.html:今天我们来聊一聊STP的端口状态.计时器.端口状 ...
- application.properties 和 pom.xml
application.properties server.port=8080 server.tomcat.max-connections=10000 server.tomcat.max-thread ...