10>>>面向对象和异常捕获
10.面向对象
面向对象:一切皆对象
什么是对象和类?
在python中,所有程序都是由数据与功能组成的。

以上图为例,name = 'joe'这个变量就是数据,函数tell_name()即是功能。
所谓的对象,就是盛放数据与功能的容器,是数据与功能的结合体。
打个比方来说:数据是睫毛膏、眼影、唇彩等化妆原材料;功能是眼线笔、眉笔等化妆工具;对象就像一个彩妆盒,把原材料(数据)和工具(功能)都装在一起。

再打个比方:对象就像是游戏中的人物。人物的基础属性就是数据,人物拥有的技能就是功能,而人物的基础属性和掌握的技能合在一起生成的人物就是对象。

对象多了,占用的资源就多了。程序猿需要一种新的功能来减少资源消耗和代码量,于是便有了类的概念。
类即类别/种类的意思。是多个对象相同数据与功能的结合体。
这个概念可以直接参考生物学上对人类的定义。
不管是黄种人、白种人还是黑种人,人类的共同特征是双足直立行走、具有高度智能和社会组织结构、属于杂食性生物等等。而皮肤、眼睛的颜色以及语言、生活习性的不同,又将人类分为不同的人种。

虽然在生物学中经常会出现“是先有鸡还是先有蛋”的问题。但是在python程序中,必须要先定义类,之后才能产生对象。
定义类
举个栗子:

定义类的语法结构
1.class是定义类的关键字 2.Student是类的名字,类名在python中推荐首字母大写 3.缩进代码块,即不同对象相同的数据和功能
需要指出的是,在类中定义函数称之为方法,以便于区分。
产生对象:类名加括号(也叫“实例化”)
obj1 = Student()
obj2 = Student()
obj3 = Student()
# 每次都会产生一个新的对象
通过查看内存地址可知,由此实例化生成的对象都是不同的对象:

访问数据和功能
类的属性包含在类中定义的变量和函数,即类的数据和功能。
类中定义的“变量/函数”可以共享给所有该类生成的对象使用。
对象访问时,会先从自己的名称空间中查找自身独有的元素,未找到则去类的名称空间查找共有元素。
1.查看内部具有的属性和方法
print(Student.__dict__)
print(obj1.__dict__)
print(obj2.__dict__)
print(obj3.__dict__)

可以看到,obj1、obj2、obj3都为空,因为它们没有自身独有的数据或方法,所有数据和方法都是来源自类Student。
2.调用属性和方法(句点符)
print(obj1.school)
print(obj2.school)
print(obj3.school)
print(obj1.choose_course())
print(obj2.choose_course())
print(obj3.choose_course())

在pycharm中,对象/类按下句点符就会自动给予提示,可以浏览可用数据和方法(上图中choose_course方法里没有填写返回值,所以下方会出现None)。
独有的数据
这次来举一个新栗子。
class Wizard:
call = '法师'
# 让对象具有独有的数据
def __init__(self,name,mp,spell):
self.name = name
self.mp = mp
self.spell = spell
# 绑定给对象的方法(绑定方法):对象调用时自动将对象当做参数传入
def spelling(self):
spelling_tip = '%s正在施放%s!'
print(spelling_tip % (self.name,self.spell))
# 产生对象:类名加括号(实例化)
mage1 = Wizard('Raistlin',15,'火球术') # 每次都会产生一个新的对象
mage2 = Wizard('Elminster',22,'闪电束')
mage3 = Wizard('Mordenkainen',28,'气泉喷升')

然后我们来调用一下对象Wizard中的spelling方法:

疑问:形参self是什么?为什么调用的时候self不需要传值?
当对象在调用类中定义的方法的时候,会自动将对象本身当成第一个位置参数传入类中,所以形参self指代的就是一个个对象。
补充
父类:多个类相同的数据和功能的结合体。
继承:一个类可以继承多个父类并拥有多个父类里所有的东西。

对象查找数据和方法的顺序:先从对象自身开始找,再去产生对象的类里面找,再去父类里面找,如果还找不到就会报错。
异常捕获
在敲代码的时候总会遇到各种各样报错,真是突出一个观者惊心闻者咂舌。现在可得了解一下这些报错究竟是怎么回事。

异常判断

以这张图为例。
报错的第一行是异常的追踪信息,起的是警报作用。
第二行显示的是异常的位置,点击双引号中的超链接就可以直接定位到出错的那一行代码。
第三行则显示的是异常类型和出错原因。
异常的分类
1.语法错误
非常常见也非常简单,就是语句出错了,不是少写了就是多写了,要不就是错写了。就如上图所示。
语法错误排除起来也很简单。如果在pycharm环境下出现语法错误,代码行下面就会有红线提示。
在工作中,语法错误是不被允许的,出现了就应当立刻改正。如果存在语法错误的程序上交给领导,可能会发生很不妙的事……

2.逻辑错误
逻辑错误也就是俗称的bug,这类错误不会出现在表面语法上,而是出现于各种逻辑嵌套之中。由于涉及到各种嵌套,逻辑错误修改起来也十分缓慢,是一项艰巨而缓慢的脑力劳动。
逻辑错误是可以允许的,但是也不能频繁出现,不然也可能发生很不妙的事。

“忽视”异常
难道就没有办法让这些错误不打扰我吗?
答案是有的,使用try检测语法可以“忽视”异常。
try:
被检测的代码
except 错误类型 as 变量名:
分支代码(变量名指代的就是错误的具体信息)


如果错误类型不一样,try检测也是无法起效的。

如果吃不准将来会出现什么样的错误类型,可以使用万能异常Exception或者BaseException
注意事项
1.异常在程序中尽量少用
2.try检测的代码要尽可能的少
补充
除了exception以外,还有其他关键字:
else
try被检测的代码没有异常的情况下会走
finally
无论是否有异常最终都会执行

浙公网安备 33010602011771号