本教程直接从语言特性入手,旨在让没有编程基础的小白或者其他语言领域大佬快速上手Python,本文只介绍最基础内容,深入使用Python不在本教程范围😉
一、面向对象
读者理解面向对象理解以下内容即可,这些内容已经足够完成本章内容的学习。
理解面向对象首先明白对象是什么:
一个可以具现化的实体都可以称作对象,对象是一种极为宽泛的定义,读者不可以简单的将对象理解为数据和数据的方法.
例如,我们可以将一只中华田园猫作为一个对象,当我们有很多只田园猫时,就可以从多个对象(中华田园猫)找出每个对象(田园猫)的共性,将这些共性放到一起就是一个类(多只田园猫的共性)。
二、 类
2.1 类的创建
【1】创建类
我们可以设想一个这样的场景,比如我们准备开一个猫咖,我们就需要对每一个种类的猫进行统一的管理。<font
color=DeepSkyBlue>
示例如下:
class ZhangHuaCat:
def __init__(self,name,age):
self.name=name
self.age=age
def Having_Dinner(self):
print(f"{self.name} is having dinner.")
def Sleeping(self):
print(f"{self.name} is sleeping.")
如上面的示例,我们首先创建了一个中华田园猫的类,每个类中存放猫的名字和年龄两个属性,并且设置猫猫的睡觉和吃饭两个方法。
【1】定义了一个名为“ZhangHuaCat”的类,这里注意一点,类的命名一般采用”骆驼拼写法“——第一个词的首字母,以及后面每个词的首字母都大写(也有一种第一个字母小写,后面单词大写的写法,但在Python中不推荐)
【2】类中的函数称为方法,要理解类的含义,我们首先需要了解类中的_ init_()函数。一般所有类中都有一个名为 _ init_() 的函数,这个方法在创建新的实例时执行。使用 init() 函数将值赋给对象属性,或者在创建对象时需要执行的其他操作
在本例中,我们定义了三个形参:self、name 和 age。在 _ init_()方法中,self必须位于所有形参中的第一个,当然可以将self称作其他名称的变量,但是其位置必须位于 _ init_()函数的所有形参中的第一个。
在使用 Python 创建ZhangHuaCat 实例时,将自动传入参数 self。每个与实例相关联的方法调用都自动传递实参 self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。创建实例时,Python 将调用实例的类的方法__init__(),这样能够传递名字和年龄,self 会自动传递,因此不需要传递self本身。每当根据类创建实例时,都只需给最后两个形参(name 和 age)提供值。
【3】在实例中我们创建了两个方法,用来标明每只猫现在的状态,接下来创建实例的过程中会为各位读者演示创建实例
【2】创建实例
我们的猫咖要引进一只可爱的田园猫:
创建一只新猫的实例,猫猫的名字为吃货:
NewCat=ZhangHuaCat('ChiHuo',2)
print(f"{NewCat.name} is {NewCat.age} years old.")
输出如下:
使用语句:
NewCat=ZhangHuaCat('ChiHuo',2)
就创建了一只名叫吃货的猫猫。
【3】访问实例
- (1) 访问实例属性
访问实例的属性可以使用以下方法:
NewCat.name
NewCat.age
- (2) 访问实例方法
在本例中,吃饭和睡觉时互斥的结构,例如吃货
先吃饭,后睡觉可以如下设置。
NewCat=ZhangHuaCat('ChiHuo',2)
NewCat.Having_Dinner()
NewCat.Sleeping()
输出如下:
2.2 类的应用
我们的猫咖现在需要监控猫猫的属性现在不能只限于名字和年龄,现在猫咖需要管理猫猫的体重和疫苗信息,需要在类中加入"weight"和”vaccine“,同时加入"Weight"和”Vaccine“两个方法,用来显示重量和打疫苗的次数。
2.2.1 给类制定默认值
所有猫猫的初始疫苗信息为0,类的设计如下:
class ZhangHuaCat:
def __init__(self,name,age,weight):
self.name=name
self.age=age
self.weight=weight
self.vaccine=0
def Having_Dinner(self):
print(f"{self.name} is having dinner.")
def Sleeping(self):
print(f"{self.name} weighs {self.weight} kilograms.")
def Weight(self):
print(f"{self.name} was vaccinated {self.vaccine} times.")
def Vaccine(self):
print(f"{self.name} was vaccinated {self.vaccine} times.")
疫苗的初始值是0次,可以使用如下操作调出疫苗的打印次数:
NewCat=ZhangHuaCat('ChiHuo',2,2)
NewCat.Having_Dinner()
NewCat.Weight()
NewCat.Vaccine()
输出如下:
设定的默认值只是疫苗的初始状态,后续会进行修改,下面就介绍属性值的修改。
2.2.2 修改类的属性值
这里介绍两种常用的修改默认值的方法:
第一种:直接修改属性的值
使用这种方法直接赋值即可完成属性值的修改:
NewCat=ZhangHuaCat('ChiHuo',2,2)
NewCat.vaccine=2
NewCat.Vaccine()
输出如下:
第二种:通过设置方法修改属性的值
【1】直接定义形参修改属性
可以在类中加入一个函数,或者说是定义一个方法,用来修改属性的值,如下:
class ZhangHuaCat:
def __init__(self,name,age,weight):
self.name=name
self.age=age
self.weight=weight
self.vaccine=0
def Having_Dinner(self):
print(f"{self.name} is having dinner.")
def Sleeping(self):
print(f"{self.name} weighs {self.weight} kilograms.")
def Weight(self):
print(f"{self.name} was vaccinated {self.vaccine} times.")
def Vaccine(self):
print(f"{self.name} was vaccinated {self.vaccine} times.")
#定义方法用来修改打疫苗的次数
def Vaccine_ValueModify(self,vaccine):
self.vaccine=vaccine
修改方法如下:
NewCat=ZhangHuaCat('ChiHuo',2,2)
NewCat.Vaccine_ValueModify(2)
NewCat.Vaccine()
输出结果如下:
【2】不定义形参修改属性
可以设计一种方法,传递形参,每调用一次函数就使疫苗次数增加一次:
class ZhangHuaCat:
def __init__(self,name,age,weight):
self.name=name
self.age=age
self.weight=weight
self.vaccine=0
def Having_Dinner(self):
print(f"{self.name} is having dinner.")
def Sleeping(self):
print(f"{self.name} weighs {self.weight} kilograms.")
def Weight(self):
print(f"{self.name} was vaccinated {self.vaccine} times.")
def Vaccine(self):
print(f"{self.name} was vaccinated {self.vaccine} times.")
#定义方法用来增加打疫苗的次数
def Vaccine_ValueModify(self):
self.vaccine+=1
调用过程如下:
NewCat=ZhangHuaCat('ChiHuo',2,2)
NewCat.Vaccine_ValueModify()
NewCat.Vaccine_ValueModify()
NewCat.Vaccine_ValueModify()
NewCat.Vaccine()
输出结果如下:
2.3 继承
我们在编写类时,并非总是要从空白开始。我们编写类的时候可能会用到其他类,这时就需要使用到一种方法——继承。
使用继承时,我们首先要带着这些概念理解继承:
- 一个类继承另一个类时,将自动获得另一个类的所有属性和方法。
- 原有的类称为父类,而新类称为子类。
- 子类继承了父类的所有属性和方法,同时还可以定义自己的属性和方法。
2.3.1 子类的继承
【1】子类的方法_init_()
子类继承后一般会调用父类的方法_init_()。
我们的猫咖需要定义猫猫的公母,母猫不需要操作,公猫需要设置是否绝育的信息。
- 母猫的类(使用pass)
于是可以有以下代码,创建了一个名为FemaleCat的子类:
class FemaleCat(ZhangHuaCat):
pass
使用 pass方法 ,可以不向该类添加任何其他属性或方法,这样, FemaleCat类拥有与 ZhangHuaCat 类相同的属性和方法。
例如可以进行如下操作:
NewCat=FemaleCat('ChiHuo',2,2)
NewCat.Vaccine_ValueModify()
NewCat.Vaccine_ValueModify()
NewCat.Vaccine_ValueModify()
NewCat.Vaccine()
这样的输出与使用父类构造的实例是相同的。
输出如下:
2. 公猫的类(使用super() )
这里的内容需要着重注意:
在子类中添加 init() 方法时,子类将不再继承父的 init() 函数,子类的 init() 函数会覆盖对父的 init() 函数的继承——这种情况称为重写父类。(本文2.3.2节)如果需保持父的 init() 函数的继承,需要添加对父的 _ init _() 函数的调用。
这种定义子类的方法中,python提供了super() 方法,这种方法会使子类从其父继承所有方法和属性。有时候父类也称为超类(superclass),名称 super 由此而来。
示例代码如下:
class ZhangHuaCat:
def __init__(self,name,age,weight):
self.name=name
self.age=age
self.weight=weight
self.vaccine=0
def Having_Dinner(self):
print(f"{self.name} is having dinner.")
def Sleeping(self):
print(f"{self.name} weighs {self.weight} kilograms.")
def Weight(self):
print(f"{self.name} was vaccinated {self.vaccine} times.")
def Vaccine(self):
print(f"{self.name} was vaccinated {self.vaccine} times.")
#定义方法用来增加打疫苗的次数
def Vaccine_ValueModify(self):
self.vaccine+=1
#子类
class FemaleCat(ZhangHuaCat):
pass
class MaleCat(ZhangHuaCat):
def __init__(self,name,age,weight):
super().__init__(name,age,weight)
调用类如下:
NewCat=MaleCat('ChiHuo',2,2)
NewCat.Vaccine_ValueModify()
NewCat.Vaccine_ValueModify()
NewCat.Vaccine_ValueModify()
NewCat.Vaccine()
输出如下:
【2】子类属性和方法定义
子类的属性和方法的定义与父类的定义方法相同,下面的例子可以很好的介绍子类的定义:
class ZhangHuaCat:
def __init__(self,name,age,weight):
self.name=name
self.age=age
self.weight=weight
self.vaccine=0
def Having_Dinner(self):
print(f"{self.name} is having dinner.")
def Sleeping(self):
print(f"{self.name} weighs {self.weight} kilograms.")
def Weight(self):
print(f"{self.name} was vaccinated {self.vaccine} times.")
def Vaccine(self):
print(f"{self.name} was vaccinated {self.vaccine} times.")
#定义方法用来增加打疫苗的次数
def Vaccine_ValueModify(self):
self.vaccine+=1
class FemaleCat(ZhangHuaCat):
pass
class MaleCat(ZhangHuaCat):
def __init__(self,name,age,weight):
super().__init__(name,age,weight)
self.sterilization=False
def Sterilization(self):
if self.sterilization:
print(f"{self.name} has been neutered")
else:
print(f"{self.name} was not neutered.")
调用如下:
NewCat=MaleCat('ChiHuo',2,2)
NewCat.sterilization=True
NewCat.Sterilization()
输出如下:
【3】重写父类
对于父类的方法,只要它不符合子类模拟的实物的行为,都可以进行重写。为此,可在子类中定义一个与要重写的父类方法同名的方法。这样,Python 将不会考虑这个父类方法,而只关注在子类中定义的相应方法。
这点在——公猫的类的方法_init_()——有具体应用。
2.4 类的导入
导入过程与导入函数相同,将类的名称等价于函数名即可。