『无为则无心』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.魔法 ...
随机推荐
- JAVA-JDK1.7-ConCurrentHashMap-测试和验证
概述 上次记录了关于ConCurrentHashMap的原理以及源码,现在我对其进行有关功能的测试,下面就讲解一下我测试的内容和代码.这些测试主要针对JDK1.7版本. GET安全测试 上一篇写过ge ...
- Python垃圾回收和Linux Fork
前言 在口袋助理看到了其他部门的同事针对Python2内存占用做的一点优化工作,自己比较感兴趣,遂记录下. Linux fork简介 fork是Linux提供的创建子进程的系统调用.为了优化创建进程速 ...
- Solon 开发,二、注入或手动获取Bean
Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...
- Redhat 如何使用yum 源(转)
1.需要把Redhat注册的信息给解决掉 This system is not registered with an entitlement server. You can use subscript ...
- 【解决了一个小问题】golang samara的kafka客户端中使用错误版本号导致初始化失败
发现在如下代码中存储kafka生产者初始化失败: config.Version = sarama.V0_10_2_1 //V2_2_0_0 producer, err := sarama.NewSyn ...
- 雷柏鼠标vt350Q配对
vt350q 闲鱼捡了个垃圾vt350q,23元,无接收器,不知道好坏 鼠标线 拿到手插上线没法用,后来用了罗技anywhere2s的线可以,原来usb鼠标线是五根. 鼠标毛病 使用后发现滚轮有时候乱 ...
- Using Swap
# create swap file dd if=/dev/zero of=/.swap bs=1048576 count=4096 # format swap mkswap /.swap # sta ...
- 多线程-守护线程-setDaemon
1 package multithread4; 2 /* 3 * 停止线程: 4 * 1,stop方法. 5 * 6 * 2,run方法结束. 7 * 8 * 怎么控制线程的任务结束呢? 9 * 任务 ...
- python网络爬虫-数据储存(七)
数据储存 主要介绍两种数据储存方法: 储存在文件中,包括text文件和csv文件 存储在数据库中,包括MySQL关系型数据库和mongoDB数据库 存储到txt title = "第一个文本 ...
- ApacheCN Java 译文集 20211012 更新
Effective Java 中文第三版 1. 考虑使用静态工厂方法替代构造方法 2. 当构造方法参数过多时使用 builder 模式 3. 使用私有构造方法或枚类实现 Singleton 属性 4. ...