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
猜你喜欢
- 一个SELECT查询中的LIKE语句来执行这种查询,尽管这种方法可行,但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时
- 这是一个给新手学习代码的帖子,包含以下内容:如何使用UBB代码,如何用js与剪贴板交互,如何使用textRange对象,如何使用自定义的快捷
- 本文实例为大家分享了python定时发送邮件的具体代码,供大家参考,具体内容如下全部代码如下:import timefrom datetim
- hasOwnPropertyhasOwnProperty是javascript中用于检测对象是否包含某个属性的方法,返回一个布尔值。var
- MySQL从5.1开始支持event功能,类似oracle的job功能。有了这个功能之后我们就可以让MySQL自动的执行数据汇总等功能,不用
- 有多少次你在考虑怎样设置数据库时感到为难?其实,如果你在Linux上使用MySQL,就不会有这种情况了。在Linux上使用Webmin图形界
- 本文实例讲述了PHP中PDO事务处理操作。分享给大家供大家参考,具体如下:概要:将多条sql操作(增删改)作为一个操作单元,要么都成功,要么
- 由于Internet的历史原因,apin负责整个网络IP的整体规划以及北美区
- 1、将css与javascript全部用下边的方法分离到外部文件中去。<link rel="stylesheet"
- <!--#include file="admin_Checkuser.asp"--> <%
- 本文将介绍在InterDev中实现网上商店购物车功能的方法,具体步骤如下:一、 数据库结构:产品数据表(Products): 存放产品信息产
- 执行环境会负责管理代码执行过程中使用的内存,编写JavaScript程序时,所需内存的分配以及无用内存的回收完全实现自动管理。原理:找出那些
- 本文实例讲述了php实现的验证码文件类。分享给大家供大家参考。具体如下:<?php/*** @file* @version 1.0*
- 借助 org.springframework.ui.Model 对象或 Map 对象将信息传到 springmvc 的页面中需要:jstl
- 如何制作一个倒计时的程序? 见下:<%CountdownDate = #1/1
- 获取一组radio被选中项的值var item = $(’input[@name=items][@checke
- pprint的英文全称Data pretty printer,顾名思义就是让显示结果更漂亮。print()和pprint()都是python
- Go 程序的性能优化及 pprof 的使用程序的性能优化无非就是对程序占用资源的优化。对于服务器而言,最重要的两项资源莫过于 CPU 和内存
- 概述从今天开始, 小白我将带领大家一起来补充一下 数据库的知识.条件查询我们可以使用关键词Where来指定条件, 用于插入, 修改删除或者查
- 惊现!表面下的隐藏信息——浅谈信息可视化1910年,病卧床上的魏格那(德国气象学家,以“大陆漂移学说”闻名),无意地注视着墙上的世界地图……