面向对象编程的相关术语

面向对象中,常用术语包括:

可以理解是一个模板,通过它可以创建出无数个具体实例。
比如, tortoise 表示的只是乌龟这个物种,通过它可以创建出无数个实例来代表各种不同特征的乌龟(这一过程又称为类的实例化)。

1
2
3
4
5
6
7
8
9
10
11
12
13
class tortoise:
bodyColor = "绿色"
footNum = 4
weight = 10
hasShell = True
def crawl(self):
print("乌龟会爬")
def eat(self):
print("乌龟吃东西")
def sleep(self):
print("乌龟在睡觉")
def protect(self):
print("乌龟缩进了壳里")

对象

类并不能直接使用,通过类创建出的实例(又称对象)才能使用。这有点像汽车图纸和汽车的关系,图纸本身(类)并不能为人们使用,通过图纸创建出的一辆辆车(对象)才能使用。

属性

类中的所有变量称为属性。
如:
tortoise 这个类中,bodyColor、footNum、weight、hasShell 都是这个类拥有的属性。

方法

类中的所有函数通常称为方法。
不过,和函数所有不同的是,类方法至少要包含一个 self 参数。例如,tortoise 类中,crawl()、eat()、sleep()、protect() 都是这个类所拥有的方法,类方法无法单独使用,只能和类的对象一起使用。

Python类的定义

Python 中定义一个类使用 class 关键字实现
语法格式:

class 类名:
多个(≥0)类属性…
多个(≥0)类方法…

注意:无论是类属性还是类方法,对于类来说,它们都不是必需的,可以有也可以没有。
另外,Python 类中属性和方法所在的位置是任意的,即它们之间并没有固定的前后次序

给类起好名字之后,其后要跟有冒号(:),表示告诉 Python 解释器,下面
要开始设计类的内部功能了,也就是编写类属性和类方法。
类属性指的就是包含在类中的变量;而类方法指的是包含类中的函数。
换句话说,类属性和类方法其实分别是包含类中的变量和函数的别称
需要注意的一点是,同属一个类的所有类属性和类方法,要保持统一的缩进格式,通常统一缩进 4 个空格。

说明文档:

和函数一样,我们也可以为类定义说明文档,其要放到类头之后,类体之前的位置

根据定义属性位置的不同,在各个类方法之外定义的变量称为类属性或类变量(如 add 属性),而在类方法中定义的属性称为实例属性(或实例变量)

事实上,我们完全可以创建一个没有任何类属性和类方法的类,换句话说,Python 允许创建空类

1
2
class Empty:
pass

可以看到,如果一个类没有任何类属性和类方法,那么可以直接用 pass 关键字作为类体即可。但在实际应用中,很少会创建空类,因为空类没有任何实际意义

init()类构造方法(构造函数)

在创建类时,我们可以手动添加一个 init() 方法,该方法是一个特殊的类实例方法,称为构造方法(或构造函数)。

构造方法用于创建对象时使用,每当创建一个类的实例对象时,Python 解释器都会自动调用它。
Python 类中,手动添加构造方法的语法格式:

def init(self,…):
代码块

注意,此方法的方法名中,开头和结尾各有 2 个下划线,且中间不能有空格

init() 方法可以包含多个参数,但必须包含一个名为 self 的参数,且必须作为第一个参数
也就是说,类的构造方法最少也要有一个 self 参数

1
2
3
4
5
6
7
8
9
class TheFirstDemo:
'''这是一个学习Python定义的第一个类'''
#构造方法
def __init__(self):
print("调用构造方法")
def say(self, content):
print(content)
add= 10
zhangsan = TheFirstDemo()

注意,即便不手动为类添加任何构造方法,Python 也会自动为类添加一个仅包含 self 参数的构造方法。

仅包含 self 参数的 init() 构造方法,又称为类的默认构造方法。

zhangsan = TheFirstDemo()
这行代码的含义是创建一个名为 zhangsan 的 TheFirstDemo 类对象

init() 构造方法中,除了 self 参数外,还可以自定义一些参数,参数之间使用逗号“,”进行分割
例如,下面的代码在创建 init() 方法时,额外指定了 2 个参数:

1
2
3
4
5
6
class TheFirstDemo:
'''这是一个学习Python定义的第一个类'''
#构造方法
def __init__(self):
print("调用构造方法")
zhangsan = TheFirstDemo()

由于创建对象时会调用类的构造方法,
如果构造函数有多个参数时,需要手动传递参数

1
2
3
4
5
6
7
class TheFirstDemo:
'''这是一个学习Python定义的第一个类'''
#构造方法
def __init__(self,nihao):
print("调用构造方法")
print(nihao)
zhangsan = TheFirstDemo("nihao")

self 不需要手动传递参数。

Python类对象的创建和使用

创建类对象的过程,又称为类的实例化。(c++/java都是)

Python类的实例化

对已定义好的类进行实例化,其语法格式:

类名(参数)

定义类时,如果没有手动添加 init() 构造方法,又或者添加的 init() 中仅有一个 self 参数,则创建类对象时的参数可以省略不写。

1
2
3
4
5
6
7
8
9
10
11
class CLanguage :
name = "漂亮鬼的个人博客"
add = "https://xiaoyangzst.vercel.app/"
def __init__(self,name,add):
self.name = name
self.add = add
print(name,"网址为:",add)
def say(self, content):
print(content)
#将该CLanguage对象赋给clanguage变量
clanguage = CLanguage("漂亮鬼的个人博客","https://xiaoyangzst.vercel.app/")

由于构造方法除 self 参数外,还包含 2 个参数,且这 2 个参数没有设置默认参数,因此在实例化类对象时,需要传入相应的 name 值和 add 值(self 参数是特殊参数,不需要手动传值,Python 会自动传给它值)
类变量和实例变量:
定义在各个类方法之外(包含在类中)的变量为类变量(或者类属性)
定义在类方法中的变量为实例变量(或者实例属性)

Python类对象的使用

定义的类只有进行实例化,也就是使用该类创建对象之后,才能得到利用。总的来说,实例化后的类对象可以执行以下操作:
访问或修改类对象具有的实例变量,甚至可以添加新的实例变量或者删除已有的实例变量;(注意操作的对象是实例变量)
调用类对象的方法,包括调用现有的方法,以及给类对象动态添加方法。

类对象访问变量或方法

使用已创建好的类对象访问类中实例变量的语法格式:

类对象名.变量名

使用类对象调用类中方法的语法格式:

对象名.方法名(参数)

注意,对象名和变量名以及方法名之间用点 “.” 连接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class CLanguage :
name = "漂亮鬼的个人博客"
add = "https://xiaoyangzst.vercel.app/"
def __init__(self,name,add):
self.name = name
self.add = add
print(name,"网址为:",add)
def say(self, content):
print(content)
#将该CLanguage对象赋给clanguage变量
clanguage = CLanguage("漂亮鬼的个人博客","https://xiaoyangzst.vercel.app/")
#输出name和add实例变量的值
print(clanguage.name,clanguage.add)

#修改实例变量的值
clanguage.name="Python"
clanguage.add="https://xiaoyangzst.vercel.app/"

#调用clanguage的say()方法
clanguage.say("人生苦短,我用Python")
不用给self参数传值

#再次输出name和add的值
print(clanguage.name,clanguage.add)
给类对象动态添加/删除变量

Python 支持为已创建好的对象动态增加 实例变量,方法也很简单

1
2
3
#为clanguage对象增加一个money实例变量
clanguage.money= 159.9
print(clanguage.money)

通过直接增加一个新的实例变量并为其赋值,就成功地为 clanguage 对象添加了 money 变量。

动态删除,使用 del 语句即可实现

1
2
3
4
#删除新添加的 money 实例变量
del clanguage.money
#再次尝试输出 money,此时会报错
print(clanguage.money)
给类对象动态添加方法

Python 也允许为对象动态增加方法。以前面的 Clanguage 类为例,由于其内部只包含一个 say() 方法,因此该类实例化出的 clanguage 对象也只包含一个 say() 方法。但其实,我们还可以为 clanguage 对象动态添加其它方法。

1
2
3
4
5
6
7
8
9
10
11
12
#先定义一个函数
def info(self):
print("---info函数---", self)
#使用info对clanguage的foo方法赋值(动态绑定方法)
clanguage.foo = info
#Python不会自动将调用者绑定到第一个参数,
#因此程序需要手动将调用者绑定为第一个参数
clanguage.foo(clanguage) # ①
#这是俩种添加方法的方式
#使用lambda表达式为clanguage对象的bar方法赋值(动态绑定方法)
clanguage.bar = lambda self: print('--lambda表达式--', self)
clanguage.bar(clanguage) # ②

上面的代码分别使用函数、lambda 表达式为 clanguage 对象动态增加了方法,但对于动态增加的方法,Python 不会自动将方法调用者绑定到它们的第一个参数,因此程序必须手动为第一个参数传入参数值,如上面程序中 ① 号、② 号代码所示。