10>>>面向对象和异常捕获

10.面向对象和异常捕获

 

面向对象:一切皆对象

 

什么是对象和类?

  在python中,所有程序都是由数据功能组成的

  以上图为例,name = 'joe'这个变量就是数据,函数tell_name()即是功能。

  所谓的对象,就是盛放数据与功能的容器,是数据与功能结合体

  打个比方来说:数据是睫毛膏、眼影、唇彩等化妆原材料;功能是眼线笔、眉笔等化妆工具;对象就像一个彩妆盒,把原材料(数据)和工具(功能)都装在一起。

img

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

img

  对象多了,占用的资源就多了。程序猿需要一种新的功能来减少资源消耗和代码量,于是便有了的概念。

  类即类别/种类的意思。是多个对象相同数据与功能的结合体。

  这个概念可以直接参考生物学上对人类的定义。

  不管是黄种人、白种人还是黑种人,人类的共同特征是双足直立行走、具有高度智能和社会组织结构、属于杂食性生物等等。而皮肤、眼睛的颜色以及语言、生活习性的不同,又将人类分为不同的人种。

img

  虽然在生物学中经常会出现“是先有鸡还是先有蛋”的问题。但是在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指代的就是一个个对象

 

补充

父类:多个类相同的数据和功能的结合体。

继承:一个类可以继承多个父类并拥有多个父类里所有的东西。

对象查找数据和方法的顺序:先从对象自身开始找,再去产生对象的类里面找,再去父类里面找,如果还找不到就会报错。

 

 

 

 

异常捕获

  在敲代码的时候总会遇到各种各样报错,真是突出一个观者惊心闻者咂舌。现在可得了解一下这些报错究竟是怎么回事。

img

 

异常判断

  以这张图为例。

  报错的第一行是异常的追踪信息,起的是警报作用。

  第二行显示的是异常的位置,点击双引号中的超链接就可以直接定位到出错的那一行代码。

  第三行则显示的是异常类型和出错原因。

 

异常的分类

1.语法错误

  非常常见也非常简单,就是语句出错了,不是少写了就是多写了,要不就是错写了。就如上图所示。

  语法错误排除起来也很简单。如果在pycharm环境下出现语法错误,代码行下面就会有红线提示。

  在工作中,语法错误是不被允许的,出现了就应当立刻改正。如果存在语法错误的程序上交给领导,可能会发生很不妙的事……

img

2.逻辑错误

  逻辑错误也就是俗称的bug,这类错误不会出现在表面语法上,而是出现于各种逻辑嵌套之中。由于涉及到各种嵌套,逻辑错误修改起来也十分缓慢,是一项艰巨而缓慢的脑力劳动。

  逻辑错误是可以允许的,但是也不能频繁出现,不然也可能发生很不妙的事。

img

 

“忽视”异常

  难道就没有办法让这些错误不打扰我吗?

  答案是有的,使用try检测语法可以“忽视”异常。

try:
    被检测的代码
except 错误类型 as 变量名:
    分支代码(变量名指代的就是错误的具体信息)

 

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

  如果吃不准将来会出现什么样的错误类型,可以使用万能异常Exception或者BaseException

注意事项

1.异常在程序中尽量少用

2.try检测的代码要尽可能的少

 

补充

  除了exception以外,还有其他关键字:

else
    try被检测的代码没有异常的情况下会走
​
finally
    无论是否有异常最终都会执行
posted @ 2021-08-31 23:17  veryjoe  阅读(59)  评论(0)    收藏  举报