Python面向对象编程之类的封装
作者:一碗周 发布时间:2022-10-20 05:29:49
1、封装的理解
封装(Encapsulation):属性和方法的抽象
属性的抽象:对类的属性(变量)进行定义、隔离和保护
分为私有属性和公开属性:
私有属性:只能在类内部访问
公开属性:可以通过类、对象名访问
可以选择公开或隐藏属性,隐藏属性的内在机理
方法的抽象:对类的方法(函数)进行定义、隔离和保护
分为私有方法和公开方法:
私有方法:只能在类内部访问
公开方法:可以通过类、对象名访问
可以选择公开或隐藏方法,隐藏方法的内部逻辑
目标是形成一个对外可操作属性和方法的接口
封装就是让数据和代码称为类的过程,表达为:类——属性——方法
2、私有类属性、公开类属性、私有实例属性和公开实例属性
2.1 公开类属性
公开类属性就是类属性,语法结构
class ClassName:
<类属性名> = <类属性初值>
def __init__(self,[参数1], [参数2], ...[参数n]):
self.<实例属性名> = <实例属性初值>
...
2.2 私有类属性
私有类属性只能当前类进行访问,子类不能访问。语法结构
class ClassName:
<__私有类属性名> = <私有类属性初值>
def __init__(self,[参数1], [参数2], ...[参数n]):
self.<实例属性名> = <实例属性初值>
...
.<类属性>
或者<对象名>.<类属性>
的方式访问
有效保证了属性维护的可控性
示例代码如下:
class TestClass:
__number = 0
def __init__(self, num_value):
for i in range(num_value + 1):
TestClass.__number += i
@classmethod # 类方法
def sum_number(cls):
return TestClass.__number
value1 = TestClass(100)
print(TestClass.sum_number()) # 5050
# print(value1.__number) # AttributeError: 'TestClass' object has no attribute '__number'
在类外卖访问.__number
就会报出AttributeError
异常
2.3 公开实例属性
公开实例属性就等于示例属性,语法结构
class <类名>:
<类属性名> = <类方法值>
def __init__(self, <参数列表>):
self.<实例属性名> = <实例属性值>
...
2.4 私有实例属性
私有实例属性只能在当前类内部使用,子类也不能使用。语法结构
class <类名>:
<类属性名> = <类方法值>
def __init__(self, <参数列表>):
self.<__私有实例属性名> = <实例属性值>
...
.<类属性>
或者<对象名>.<类属性>
的方式访问
有效保证了属性维护的可控性
示例代码:
class TestClass:
def __init__(self, num_value):
self.__number = 0
for i in range(num_value + 1):
self.__number += i
def sum_number(self):
return self.__number
value1 = TestClass(100)
print(value1.sum_number()) # 5050
# print(value1.__number) # AttributeError: 'TestClass' object has no attribute '__number'
2.5 私有属性不一定真的私有
私有属性的双下划线只是一种转换约定,转换后,类内原有名字发生了变化,这是一种形式上的私有
示例代码:
class TestClass:
def __init__(self, num_value):
self.__number = 0
for i in range(num_value + 1):
self.__number += i
def sum_number(self):
return self.__number
value1 = TestClass(100)
print(value1.sum_number()) # 5050
print(value1._TestClass__number) # 5050
# 可以通过 对象名._类名__属性 的方式来访问
可以通过对象名._类名__属性的方式来访问。
3、私有方法和公开方法
定义方法是在类内部定义并使用的方法。语法结构
class <类名>:
def <__私有方法名>(self, <参数列表>):
...
私有方法定义的时候属性名字前面需要两个下划线( __
).
各类方法都可以通过增加双下换线的方式将方法变为私有方法
私有方法在形式上保护了Python
类内部使用的函数逻辑
私有属性与公开是程序员逻辑,不是安全逻辑,重视约定
4、类的保留属性
Python
解释器预留的类属性,以双下换线开头或者结尾。
保留属性也叫特殊属性
以双下划线开头和结尾
作用是为理解
Python
类提供了统一的属性接口属性值具有特殊的含义,类定义后直接使用
仅用<类名>
访问的保留属性
保留属性 | 描述 |
---|---|
__name__ | 类的名词 |
__qualname__ | 以.分隔从模板全局命名空间开始的类名称 |
__bases__ | 类所继承的基类名称 |
5、类的保留方法
保留方法是Python
解释器预留的方法,以双下划线开头和结尾
保留方法也叫特殊方法
以双下划线开头和结尾
作用是为理解
Python
类提供了统一的方法接口方法逻辑:具有特定的含义,一般与操作符关联,类定义需要重载
来源:https://juejin.cn/post/7023378125027278856


猜你喜欢
- 引言:Python中的变量在使用中很流畅,可以不关注类型,任意赋值,对于开发来说效率得到了提升,但若不了解其中的机理,往往也会犯一些小错,让
- 忘了在哪看到一位编程大牛调侃,他说程序员每天就做两件事,其中之一就是处理字符串。相信不少同学会有同感。几乎任何一种编程语言,都把字符串列为最
- <html> <head> <meta http-equiv="Content-Type"
- 一、功能说明:1. 多线程方式抓取代理服务器,并多线程验证代理服务器ps 代理服务器是从http://www.cnproxy.com/ (测
- 前言优化器的选择关乎参数更新的方法,合理的方法可以帮助机器学习更好的寻找到全局最佳值。那我们快点开始学习吧tensorflow常见的Opti
- 前言判断文件是否存在在实际应用中用的非常多,下面我们来归纳一下检查文件、文件夹是否存在的各种操作一.检查文件夹/文件是否存在1. os.pa
- 很多人可能发现,无论是在sql 2000, 还是在 sql 2005 中,都没有提供字符串的聚合函数, 所以, 当我们在处理下列要求时,会比
- 今天有朋友问我 Turtle的安装问题,在这里简单说在github上我们可以看到Turtle这个库很久没有更新了,里面还有一些python3
- 1.在线定制下载echartshttps://echarts.apache.org/zh/builder.html2.创建一个django项
- 一、前言 英语单词之间是通过空格分隔的,但是中文却不存在空格的概念,因此需要
- 从这里开始我的博客,后台数据库是什么?没错,就是MySQL,服务器端使用的脚本就是PHP,整个框架使用的是WordPress。PHP和MyS
- python使用pandas和xlsxwriter读写xlsx文件已有xlsx文件如下:1. 读取前n行所有数据# coding: utf-
- python是很容易上手的编程语言,但是有些时候使用python编写的程序并不能保证其运行速度(例如:while 和 for),这个时候我们
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 19 - TooltipsMootools 1.2
- 正则表达式正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为&q
- 本文主要给大家分享一个实战项目,通过python代码写一款我们儿时大多数人玩过的游戏---小弹球游戏。只不过当时,我们是在游戏机上玩,现在我
- 决策树之ID3算法及其Python实现,具体内容如下主要内容决策树背景知识决策树一般构建过程ID3算法分裂属性的选择ID3算法流程及其优缺点
- 本文实例为大家分享了python生成验证码图片代码,分享给大家供大家参考,具体内容如下基本上大家使用每一种网络服务都会遇到验证码,一般是网站
- 本文实例为大家分享了python实现吃苹果小游戏的具体代码,供大家参考,具体内容如下1.公共类模块import pygamefrom pyg
- 1、sys.stdin.readline()与inputimport sys# sys.stdin.readline() 相当于input,