『无为则无心』Python面向对象 — 52、私有成员方法(类中行为的封装)
Python对于类的成员没有严格的访问控制限制,这与其他面向对象的编程语言是有所区别的。
关于私有方法其实和私有属性差不多,有如下要点:
- 1、通常我们约定,两个下划线开头的方法是私有方法。
- 2、类内部可以访问私有方法。
- 3、类外部不能直接访问私有方法,也就是不同通过
对象.方法名直接调用。 - 4、类外部可以通过
_类名__私有方法名访问私有方法。
示例:
# 在函数名的前面添加两个下划线,此时该函数被称为私有函数
# 只能在当前类中被直接调用,不同通过对象.方法名调用
# 私有函数
class Student():
def __init__(self, name, age):
# 普通变量
self.name = name
# 私有变量
self.__age = age
def tellMe(self):
print(f"大家好,我是{self.name}。是一个公共方法")
# 在公共函数中调用私有方法,
# 调用格式:self.__私有的函数名称(参数列表)
self.__tellMeAll()
# 定义一个私有方法
def __tellMeAll(self):
print(f"我{self.__age}岁,但我一般不告诉别人。是一个私有方法")
# 在公共函数中调用私有方法,
# 调用格式:self.__私有的函数名称(参数列表)
# 创建一个Student对象
stu = Student("美猴王", 18)
# 调用公共方法
"""
输出结果:
大家好,我是美猴王。是一个公共方法
我18岁,但我一般不告诉别人。是一个私有方法
从结果中可以看到,公共方法可以直接通过对象.方法名直接调用。
私有方法可以再对象中被调用。
"""
stu.tellMe()
# 通过对象.方法名直接调用私有方法
# 报错
# AttributeError: 'Student' object has no attribute '__tellMeAll'
# stu.__tellMeAll()
# 通过对象.方法名直接调用私有方法
# 没有报错
# 输出:我18岁,但我一般不告诉别人。是一个私有方法
stu._Student__tellMeAll()
类中的成员私有优化原理总结:
- Python默认的成员函数和成员变量都是公开的,而在Python中私有属性和私有方法是没有类似Java语言的
public,private等关键词来修饰的。 - 在Python中定义私有变量,只需要在变量名或函数名前加上
__两个下划线,那么这个函数或变量就Python中的私有成员了。 - 这是在Python内部使用一种
name mangling技术,将__membername替换成_classname__membername,所以你在类(对象)外部使用原来的私有成员的名字时,会提示找不到。
『无为则无心』Python面向对象 — 52、私有成员方法(类中行为的封装)的更多相关文章
- 『无为则无心』Python面向对象 — 51、私有成员变量(类中数据的封装)
目录 1.私有成员变量介绍 (1)私有成员变量概念 (2)私有成员变量特点 (3)私有成员变量体验 2.属性私有化工作原理 3.定义成员变量的标识符规范 4.私有成员变量的获取和设置方式 1.私有成员 ...
- 『无为则无心』Python面向对象 — 45、面向对象编程
目录 1.面向对象编程的概念 2.面向对象编程和面向过程编程的区别 (1)面向过程编程 (2)面向对象编程 3.举例理解面向对象 4.Python的面向对象编程 5.面向对象的几大核心特性 1.面向对 ...
- 『无为则无心』Python面向对象 — 46、类和对象
目录 1.理解类和对象 2.类 3.对象 4.Python中的对象 5.类和对象的定义 (1)定义类 (2)创建对象 (3)练习 6.拓展:isinstance() 函数 1.理解类和对象 (1)类和 ...
- 『无为则无心』Python面向对象 — 53、对Python中封装的介绍
目录 1.继承的概念 2.继承的好处 3.继承体验 4.单继承 5.多继承 1.继承的概念 在Python中,如果两个类存在父子级别的继承关系,子类中即便没有任何属性和方法,此时创建一个子类对象,那么 ...
- 『无为则无心』Python面向对象 — 47、Python中的self详解
目录 1.self的作用 2.self的使用注意事项 (1)self代表类的实例,而非类 (2)self不必非写成self,只是一种规范. (3)类中方法的形参中一定要写self,包括内置函数 (4) ...
- 『无为则无心』Python面向对象 — 54、重写和super()函数
目录 1.重写 2.super()函数 方式一 方式二 __mro__内置类属性说明 1.重写 在子类中如果有和父类同名的方法,则通过子类实例去调用该方法时,会调用子类中的该方法而不是父类的方法,这个 ...
- 『无为则无心』Python面向对象 — 55、多层继承和继承中的私有成员
目录 1.Python支持多层继承 (1)多层继承实现 (2)多层继承和多重继承区别 2.继承中的私有成员 (1)继承中父类私有属性和私有方法 (2)获取和修改私有属性值 1.Python支持多层继承 ...
- 『无为则无心』Python面向对象 — 58、类方法和静态方法
目录 1.实例方法 2.类方法 (1)类方法特点 (2)类方法使用场景 3.静态方法 (1)静态方法特点 (2)静态方法使用场景 1.实例方法 实例方法既可以调用静态方法也可以调用类方法. # 定义一 ...
- 『无为则无心』Python面向对象 — 59、魔法方法
目录 1.魔法方法__new__() 2.魔法方法__init__() 3.魔法方法__del__() 4.魔法方法__str__()和__repr__() 5.魔法方法__call__() 6.魔法 ...
随机推荐
- 我选择了MySQL和SpringData JPA
我是3y,一年CRUD经验用十年的markdown程序员常年被誉为优质八股文选手 今天想跟大家聊聊数据库层面上的事,austin项目继续更新(注:今天聊的数据库都特指关系型数据库) 01.数据库选择 ...
- docker创建mysql容器时挂载文件路径后无法启动(已解决)
系统centos7 docker版本: 解决方法: 在docker run中加入 --privileged=true 给容器加上特定权限,如下 docker run --privileged=tru ...
- MASA Framework - EventBus设计
目录 MASA Framework - 整体设计思路 MASA Framework - EventBus设计 概述 利用发布订阅模式来解耦不同架构层级,亦可用于解决隔离业务之间的交互 优点: 松耦合 ...
- Unity打包安卓项目问题汇总(持续更新)
1.V1,v2签名问题 安卓11以上--v1签名无法使用: 安卓7以下--v2无法使用: 应用宝不支持没有v1签名的包: AndroidStudio版本2020打签名包时无法勾选v1,v2选项,4.2 ...
- [C# 学习]委托和线程
委托有点像C语言的函数指针,简单总结一下如何使用委托. 1. 声明一个委托 public delegate void LabelSetEventHandler(Label la, string str ...
- 学习鸟哥linux私房菜--安装中文输入法fcitx
首先需要卸载前面安装的scim,查阅命令,参考网址如下 http://www.cnblogs.com/propheteia/archive/2012/06/26/2563383.html 链接中博主采 ...
- 执行df hang住
突然有一天发现df执行卡住了,一直不显示结果. $ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 221G 100G 121G ...
- kubernetes之配置Metrics Server
Kubernetes 1.8 关于资源使用情况的 metrics,可以通过 Metrics API 获取到, Kubernetes 1.11 已经废弃 heapster.这里我们基于 Kubernet ...
- [源码解析] 模型并行分布式训练 Megatron (3) ---模型并行实现
[源码解析] 模型并行分布式训练 Megatron (3) ---模型并行实现 目录 [源码解析] 模型并行分布式训练 Megatron (3) ---模型并行实现 0x00 摘要 0x01 并行Tr ...
- 在IDE中添加widfly依赖
动机:在IDE中添加widfly依赖 原由:widfly实现了servlet接口,有我们对外交互时所需求的jar包 步骤: 第一步: 找到module依赖的地方 第二步:点击左侧的添加按钮,点击Lib ...