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 复制这段内容后打开百度网 ...
随机推荐
- .Net Core微服务——自动收缩、健康检查:Consul(三)
继续上一篇的话题,顺便放上一篇的传送门:点这里. 健康检查 经过之前的操作,我的consul已经支持自动扩展,并且调用也很靠谱.但是这里有个问题,一旦服务列表里的某个服务挂了,consul并不知道,还 ...
- 八大排序算法~冒泡排序【加变量flag的作用】
八大算法~冒泡排序[加变量flag的作用] 1,冒泡排序思想:从第一个数开始找,要把大数"排除在外"~为大数找后座.(从小到大排序哈) 外层循环~需要放后的大数个数: 内循环~从第 ...
- nacos Connection refused (Connection refused)
记录一次"异常bug",具体信息如下.主要是记录一下处理过程,可能口水话比较多,如果想看结果,直接往后拉即可. 最后一行 起初,运维同事找到我,跟我说程序出问题了,系统升级,一直连 ...
- 14Java进阶网络编程API
1.网络协议的三要素:语义.语法和时序 语义表示要做什么,语法表示要怎么做,时序表示做的顺序. 2.网络OSI七层模型 OSI/RM 模型(Open System Interconnection/Re ...
- #使用C#winform编写渗透测试工具--子域名挖掘
使用C#winform编写渗透测试工具--子域名挖掘 这篇文章主要介绍使用C#winform编写渗透测试工具--子域名挖掘.在渗透测试中,子域名的收集十分重要,通常一个网站的主站的防御能力特别强,而他 ...
- js 倒计时退出
<p>您已提交成功!<span id='submit_second'></span></p> $("#submit_second") ...
- 关于win7+cenos 7双系统安装
---恢复内容开始--- 1,cenos 0 7制作U盘启动 制作工具 http://pan.baidu.com/s/1nv9lpmp 镜像自备 2,安装centos 7 释放磁盘空间,如:20G.用 ...
- 等Excel工作簿关闭后自动加密压缩备份
;; 等Excel工作簿关闭后自动加密压缩备份.ahk;; 腾讯QQ号 595076941; 作者:boai; 写作日期:2019年5月15日; 版本号:第1版; 手机号(中国移动) 138##### ...
- 来看看是什么原因导致生产服上的系统CPU高的?
我们可能会遇到生产服务器CPU很高的问题,有时候能确定是哪个进程,但是不知道这个进程都在干什么,所以也无从下手,无法解决问题.只能不断的重启,重启等. 最近也看了[一线码农]的一些教程,觉得都很不错, ...
- Xmind-xss漏洞复现并上线Coblat-strike
前言:本漏洞由WebRay烽火台实验室发现,Xmind2020存在xss漏洞,并且可以进行任意代码执行,目前官方还未进行补丁修复,所以请目前Xmind用户警惕Xmind文件. 本博客讲复现漏洞及上线到 ...