1. 面向对象
编程语言中,一般有两种编程思维,面向过程和面向对象。 面向过程即函数
面向过程,看重的是解决问题的过程。
这好比我们解决日常生活问题差不多,分析解决问题的步骤,然后一步一步的解决。
而面向对象是一种抽象,抽象是指用分类的眼光去看世界的一种方法。
Python 就是一门面向对象的语言
面向对象都有两个基本的概念,分别是类和对象。
- 「类」
用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 「对象」
通过类定义的数据结构实例
1.1. 怎么理解类
可以将他理解为一个加强版的函数或者说是一个加强版的模板
类里面可以有属性(变量)和方法(函数)
1.2. 怎么定义类
知道了类是什么样子的,我们接下来就要学习怎么去定义类了。
类定义语法格式如下:
class ClassName(): pass class ClassName: pass
可以看到,我们是用 class
语句来自定义一个类的,其实这就好比我们是用 def
语句来定义一个函数一样。
类是变量和方法的集合包,那么我们来创建一个类。
class Stu: school = "SDAU" def where_from(self): print(f"我来自于{self.school}") def which_sex(self,sex=1): if sex: print("你是男生") else: print("你是女生")
1.3. 怎么调用类属性和类方法
我们定义了类之后,那么我们怎么调用类里面的属性和方法呢?
使用 .
来去访问一个类的属性或者方法,所以对于我们自己构造的Stu
类
class Stu: school = "SDAU" def where_from(self): print("我来自于" + self.school) def which_sex(self,sex=1): if sex: print("你是男生") else: print("你是女生") >>> s = Stu() >>> s.school 'SDAU' >>> s.where_from() '我来自于SDAU'
1.4. 类和对象之间的关系
这部分内容主要讲类和对象,我们先来说说类和对象之间的关系。
「类是对象的模板」
我们得先有了类,才能制作出对象。
类就相对于工厂里面的模具,对象就是根据模具制造出来的产品。
「从模具变成产品的过程,我们就称为类的实例化。」
「类实例化之后,就变成对象了。也就是相当于例子中的产品。」
1.5. 初始化函数
初始化函数的意思是,当你创建一个实例的时候,这个函数就会被调用。
先对上面的类进行改装
class Stu: school = "SDAU" def __init__(self): print("这是一个初始化函数,在进行实例化的时候这个函数就会自动运行") def where_from(self): print("我来自于" + self.school) def which_sex(self,sex=1): if sex: print("你是男生") else: print("你是女生")
当代码在执行 s = Stu()
的语句时,就自动调用了 __init__(self)
函数。
「而这个 __init__(self)
函数就是初始化函数,也叫构造函数。」
初始化函数的写法是固定的格式:中间是 init
,意思是初始化,然后前后都要有【双下划线】, __init__()
函数的第一个参数一定要写上 self
,不然会报错。
构造函数(初始化函数)格式如下:
def __init__(self,[...): ...
初始化函数一样可以传递参数的,例如:
class Stu: school = "SDAU" def __init__(self,name): self.name = name def where_from(self): print("我来自于" + self.school + '的' + self.name) def which_sex(self,sex=1): if sex: print("你是男生") else: print("你是女生")
将一个方法变成一个属性,使用@property
装饰器
class Stu: school = "SDAU" def __init__(self,name): self.name = name @property def where_from(self): print(f"我来自于{self.school}的{self.name}") return school def which_sex(self,sex=1): if sex: print("你是男生") else: print("你是女生")
1.6. 类的特性
面向对象有三个特点,分别是继承、多态、封装,这里只讲继承特性。继承和生活中的继承类似,就是说继承者可以拥有被继承者的东西。下面我们先来看下面一段代码。
class Dog: def eat(self,food): print(food) class Cat: def eat(self,food): print(food)
我们定义了两个类,分别是Dog
和Cat
他们都有eat
方法,但是可以发现eat
方法做的事情是一样的,这里都只是打印一下,可以想象一下,如果做的事情很复杂,写的代码也就随之增加,那么这个时候就意味着两个类的eat
方法会很长,但是又相同,那么有没有一个方法可以只写一遍,就可以被这两个类所使用那?答案是有的,继承是一个有效的方法。
class Animal: def eat(self,food): print(food) class Cat(Animal): ... class Dog(Animal): ...
通过创建一个Animal
类,让Dog
和Cat
都继承自他,这样就可以拥有Animal
的方法,从而减少代码量,便于维护。
2. 错误处理
2.1. 错误类型
先来看一段代码
a = 1/0 print("这一行不会运行,因为第一行就报错了")
上面的代码如果放到python中运行会报错ZeroDivisionError: sectionision by zero
因为分母不能为0
大家可以想一个问题,在我们写代码的过程中,总是避免不了出错,只要出现错误我们的程序就不会再继续运行。错误有两种
「一种是写代码过程中出现的语法错误」
list1 = [1,2,3,4] for i in list1 #这里会报错,因为没有加冒号,属于语法错误 print(i) # SyntaxError: invalid syntax
「一种是除语法错误之外的错误」
a = 1/0 # 这里会报错,因为0不能作为分母
我们要讲的错误处理就是为了解决第二种错误,除语法错误之外的错误
错误处理的本质就是让程序不在纠结迷茫
2.2. 错误捕捉
python中使用try
-except
语句来进行错误的捕捉,具体的看下面的例子
try: a = 1/0 except: print("a = 1/0这一句有错误时,就会运行这一句") else: print("a = 1/0这一句没有错误时,就会运行这一句") finally: print("无论a = 1/0这一句有没有错误时,这一句都会运行")
如果我们希望获取错误信息
try: a = 1/0 except Exception as e: # 这里的Exception代表所有的错误类型 # 就说是只要是报错,错误都都属于Exception print(e)
2.3. 错误抛出
使用raise
关键字来抛出错误
raise 错误的名字("对错误的说明")
举个例子
def convert(list_data): if isinstance(list_data,list): raise TypeError(u"这个函数的作用对象是一个列表") else: return [i*i for i in list_data]
2.4. 自定义错误
python中自定义错误的实现是基于类的继承来实现的
# 定义错误 class MyError(Exception): # 使用类的继承 pass # 在代码中使用自定义的错误 try: raise MyError("这是一个我自定义的错误类型") except MyError as e: print(e)
完~