发布时间:2020/07/13 作者:天马行空 阅读(1437)
一、两种编程方式
1.1、面向过程编程
使用函数将具体过程依次表达出来的编程方式叫做面向过程编程。
1.2、面向对象编程
图形的虚线左侧,描述了各类之间的继承关系,其中的哺乳动物类是犬科类和猫科类的父类。哺乳动物类的很多特性(比如胎生、体温恒定等)都是这类共有的,这些特性通过继承的方式传递给它的子类,比如猫科类和犬科类。而犬科类和猫科类互为兄弟类。
虽然犬科和猫科都从哺乳动物继承而来,有许多共同点,但它们也有各自的特点,比如就感知功能而言,猫科的视觉和听觉更灵敏而犬科的嗅觉更优秀。类之间的差异性,我们称为“多态性”。
在给这些动物做分类时,每一个分类其实都代表了具有某些共同特征的动物,当我们提到某种动物属于哺乳动物类的时候,就已经代表了这种动物具有特定的特征,不再需要啰嗦赘述“猫是恒温的、胎生的等等”,只需要“猫是哺乳动物”一句话就描述清楚了。将各种各样的特征用一个类的概念进行归纳,称为类的“封装性”。
上图虚线的右侧,则表示了类与个体实例之间的关系。类就似一个模板,通过它可以构造出无数个实例。这些实例之间可能有某些微小的差异(如老虎的体重、体长、花纹等),但是基本特征符合对应类的特征(比如四肢行走、能够捕猎、能够吼叫等)。
用一句话来概括就是,类是实例的模板,实例是类的具体化。
在面向对象编程中,也把实例称为对象。
二、从定义类到构造实例
2.1、定义类
类定义使用关键词class,完整的语法是:
一个类可以从多个父类继承而来,父类的个数可以开发者根据需求自己定义。
Python里面所有的“体”我们都已经接触到了。它们是if判断语句下面的判断体,for和while语句下面的循环体,def下面的函数体和class下面的类体。
体的概念很重要,它决定着一些变量的作用域。补充一下Python世界中常见的体:
创建一个类
class FelidAnimal(): pass print(FelidAnimal)
现在我们还没有对猫科动物类定义任何东西,所以暂时使用占位符pass(它表示什么都不做,只不过写点东西在类体内保证语法不出错)。
2.2构造实例
实例的语法是:my_animal = FelidAnimal()。
class FelidAnimal(): pass # 构造实例 my_animal = FelidAnimal() # 打印实例信息 print(my_animal)
体会构造方法
class FelidAnimal(): def __init__(self, fur, height, weight): self.fur = fur self.height = height self.weight = weight felid_animal1 = FelidAnimal(fur="yellow", height=1.2, weight=250) print("猫科动物1的颜色是:{}" .format(felid_animal1.fur)) print("猫科动物1的身高是:{}" .format(felid_animal1.height)) print("猫科动物1的体重是:{}" .format(felid_animal1.weight))
在这段代码中,我们在类体中使用def __init__(self, fur, height, weight):的形式定义了一个跟函数看起来几乎一样的东西。
我们把这样的在类内定义的函数,叫做方法。而这个方法比较特别,函数名是__init__(注意:init前后分别两个下划线)。
__init__()方法被叫做构造方法。当一个类的对象被创建出来的时候,首先会执行构造方法中的逻辑。
在声明类的构造方法时,传入的这个self参数,可以让构造方法在实现逻辑时,起到“指向自己”的作用。
三、从实例变量到类变量
3.1、实例变量
实例变量是当有实例时才会有的变量,不同实例所对应的实例变量是不一样的,比如前面例子中Tom猫和Jerry猫的名字、皮毛各不相同。
3.2、类变量
类变量可以在类体中,类的方法之外定义。
类变量被改变时,通过所有这个类的实例访问这个类变量时,都会发现变量被改变了。
在代码的执行过程中,可以动态地添加类变量(通过类名.变量名 = xxx的方式)和实例变量(通过实例名.变量 = xxx的方式)。
增加的类变量会被同个类的全部实例看到并且有同一个值;而增加的实例变量只能对当前实例起作用。
魔法变量__dict__
存储了所有的类变量和实例变量的名字。
类名.__dict__
实例名.__dict__
虽然我们可以通过在类体之外增加实例变量和类变量,但是Python不建议这样做,因为类应该是封装好的,不应该再在类体之外做改变。
当一个实例中的实例变量,刚好与类变量同名的时候,在代码中使用实例名.变量名的时候:
通过实例名.变量名 = xxx方式操作之后,如果这个变量名之前不是实例变量,它会被新添成一个实例变量,即使这个时候已经存在一个同名的类变量。
通过实例名.变量名读取变量的时候,Python会先从实例中寻找是否有变量名这样的实例变量,如果有,就获取它的值,如果没有,再到类变量中查找变量名。
总结:
面向过程编程:一种以过程为中心的编程方法,以什么正在发生为主要目标进行编程。
面向对象编程:通过定义类和构造实例的方法进行编程。
体:某些特定语法下面的代码块,包括 if判断语句下面的判断体,for和while语句下面的循环体,def下面的函数体和class下面的类体。
封装性:类的三大特性之一,将数据(变量)和操作(功能)封装在一起,变成一个类。
继承性:类的三大特性之一,描述了一种关系,即子类与父类具有相同的数据(变量)和操作(功能)。我们将在后面关卡详细讲解。
多态性:类的三大特性之一,描述了一种关系,即类之间具有不同的数据(变量)和操作(功能)。
驼峰法:类名命名的代码规范,使用多个单词命名,每个单词首字母大写。
实例变量:实例的变量,只作用于当前实例。
类变量:类的变量,作用于类,可以通过类名.变量名方式访问,对于没有同名变量的实例,也可以通过实例名.变量名方式访问。
魔法变量:object类中前后各有两个下划线的变量,如__dict__变量。
方法:在类体中的函数叫做方法。
魔法方法:object类中前后各有两个下划线的方法,如构造方法__init__。
练习:构建一个应聘者类
class jober(): job_company = '小象金融' job_type = '校园秋招' def __init__(self, name, age, sex, job, special, education): self.name = name self.age = age self.sex = sex self.job = job self.special = special self.education = education jober1 = jober(name = '张三', age = 28, sex = '男', job = '开发工程师', special = '无', education = '本科') my_dict = jober1.__dict__ for i in my_dict: print('{}的{}是{}'.format(jober1.name,i,my_dict[i]))