python从封装理解类的作用

前言

从类开始就开始进入编程学习新的阶段。类算是我们学习编程一个门槛,虽然类的相关知识很多,拦在我们面前并不是内容艰深和知识很多,而是理解类到底是什么这个方向不明确。
通常我们学习完类的封装、继承、多态、类的关联关系、七个设计原则、23个常用设计模式才开始明白类是什么干啥用的,但我想最基础和最重要是理解封装,只有理解封装我们深刻类是什么,
类就是把相关数据和相关方法绑定在一起,实现分开组合方式完成程序编码,面向对象编程通过加一层封装管理方式把面向过程的函数和数据零散摆放,导致管理困难这个缺点补全了。
因为变量和函数变多后,面向过程很难同时管理众多变量和函数。就像电脑有CPU、硬盘、内存都是单独存在,通过插在主板接口实现通讯组合成一台电脑。每个硬件都是把跟本硬件相关的元器件装在一起。

1、类的概念

简单回顾总结一下类概念

  • 类:可以理解是一个模板。
  • 对象:通过类创建出来实例。
  • 属性:类中所有变量称为属性。
  • 方法:类中的所有函数称为方法。

2、类的结构

class 类名:
	类属性
	类方法

3、类的命名规范

如果由单词名称构成的类,建议每个单词字母大写,其他字母小写。

4、封装

复杂的程序,最好使用面向对象方式编程,简单的程序,使用面向过程方式编程。

  • 封装简单来说就是一些相关属性和方法放在一起并且提供方法调用。
  • 面向对象就是通过类的方式把相关逻辑和数据封装。
  • 面向过程只是把逻辑封装,与逻辑相关数据没有放在一起。

举例:实现小明吃饭程序

# 面向过程实现
person='小明'         # 变量 人的姓名
food='饭'             # 变量 食物的名称
def eat(person,food): # 函数 吃
	print(person,'吃',food)
	
eat(person,food)      # 调用函数

如果程序实现内容再增加一点:小明吃饭,小王吃粥。
变量多了不好维护,但是为了清晰表达加个后缀区分它们。

# 面向过程实现
person_xiaoming='小明'      # 变量 人的姓名
person_xiaowang='小王'      # 变量 人的姓名
food_rice='饭'              # 变量 食物的名称
food_rice_porridge='粥'     # 变量 食物的名称
def eat(person,food):       # 函数 吃
	print(person,'吃',food)
	
eat(person_xiaoming,food_rice)         # 调用函数
eat(person_xiaowang,food_rice_porridge)# 调用函数

如果程序实现内容再增加一点:小明、小李吃饭,小王喝粥。
那么变量变得更多而且都要加后缀,当然可以使用列表减少变量。

# 面向过程实现
person=['小明','小王','小李']      # 变量 人名列表
food=['饭','粥']              	  # 变量 食物列表
def eat(person,food):       # 函数 吃
	print(person,'吃',food)
	
eat(person[0],food[0])         # 调用函数
eat(person[1],food[0])         # 调用函数
eat(person[2],food[1])         # 调用函数

面对程序变得复杂,我们把相关放在一起,用一个列表包含多个变量方式减少变量数。
恭喜,这里你已经使用面向对象的封装思想。

  1. 面向对象编码使用了封装方式来降低编码的复杂性,即使用类来封装属性和方法的方式,将不相关代码隔绝,方便我们不受干扰和更小的范围来编码。
  2. 面向过程编码不使用封装方式,不相关的变量混在一起,不相关的函数和函数混在一起,往往代码可读性很差。原因是程序复杂后,带来变量和函数急剧增加,看到一个变量或者的名字几乎无法识别谁在用,什么时候会用了。

5、类的理解

封装是一种管理思想,类是实现封装的编码方式。

# 面向对象实现
class Person:
	# person类
	# 属性:姓名
	# 方法:吃()
	# 方法:玩()
	def __init__(self,name):#构造函数
		self.name=name
		
	def eat(self,food):
		print(self.name,food.action,food.name)
		
	def paly(self,ball):
		print(self.name,ball.action,ball.name)
		
class Ball:
	def __init__(self,name,action):
		self.name=name	
		self.action=action
		
class Food:
	def __init__(self,name,action):
		self.name=name
		self.action=action


xiaoming = Person('小明')
ball=Ball('篮球','打')
food=Food('饭','吃')
xiaoming.eat(food)
xiaoming.paly(ball)

总结一下面向过程和面向对象的大致代码样子。

面向过程程序{
[变量1=数据1    变量2=数据2    变量3=数据3]
[函数1]
[函数2]
[函数3]

mian(主函数)
函数1(数据3)
函数2(数据4)
函数3(数据5)
}
面向对象程序:1[属性1    方法1]2[属性2    方法2]3[属性3    方法3]

mian(主函数)
创建对象1=1(数据1)
创建对象2=2(数据2)
创建对象3=3(数据3)
对象1.方法1(数据4)
对象2.方法2(数据5)
对象3.方法3(数据6)
  • 类把相关数据和方法绑在一起了,而且规定方法不能直接访问其他类的属性。
  • 面向过程的函数却是可以访问定义在外部所有变量。
    直观来看,我们并不是很清楚每个变量是谁在使用,必须去看函数内部。
  • 加了一层类的封装,我们完全可以把类看成一个黑盒子。
    类把相关数据和方法绑定,一旦完成编码测试,不需要属性和方法是如何一起完成任务,只需要知道类可以干什么。
  • 从严格规范面向过程也可以做到,但是不直观,这可不是小问题,大型项目里面如果一起管理这么多变量和方法,会成为很大负担。

6、封装是一种管理的思想。

封装思想和我们层级管理思想相同,封装是对外部是关闭但同时曝露方法可供使用。
比如:由于每个员工只负责完成一项工作的部分环节,领导不关心员工如何具体完成每一个环节,而关心员工分工和有效衔接。我们不关心每个类是如何实现,而关心具体有那些类和类之间是如何有效衔接进而完成工作。

总结

  • 用类来封装与类定义相关的属性和方法,让我们卸下管理变量和函数的负担,而我们所需要做的是通过尽可能把相关东西(数据和方法,属性是用来承载数据的)放在一起。封装是非常重要的概念,贯穿整个面向对象的编程思想,包括继承和多态、设计模式都可以看成是封装思想的应用。

  • 封装带来便利但同时也带来问题,我们必须研究类与类的相互关系,不得不构建一个良好的方式将类组合起来实现复杂过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值