做外国网站买域名,网站开发与应用专业就业方向,云南交投集团公路建设有限公司网站,项目管理网站开发在上一篇文章中#xff0c;我们了解了函数。这一篇文章我们来了解一下Python中另外一个重要的概念#xff1a;类与对象。
1、类与对象
#xff08;1#xff09;类与对象有什么关系#xff1f;
你可能会奇怪#xff0c;为什么要叫类与对象呢#xff1f;是两个不同的东…在上一篇文章中我们了解了函数。这一篇文章我们来了解一下Python中另外一个重要的概念类与对象。
1、类与对象
1类与对象有什么关系
你可能会奇怪为什么要叫类与对象呢是两个不同的东西吗简单来说类代表一个类别而对象则代表类的一个实例。比如我们在变量与数据类型中学习的整型变量为例。
a 3print(type(a))
输出结果为
class int
我们创建了一个变量 a并赋值为 3然后打印了它的类型。可以看到输出 int代表整型变量。 细心的你也发现了输出里面有一个单词 class它就是类别的意思。难道说所谓的整型是一个类你猜得没错。这里的整型int就是一个类。而我们创建的整型变量 a就是他的一个实例。
我们再举一些生活中的例子
“人”是一个类小明则是“人”这个类的一个实例所以小明是一个对象“打车公司”是一个类滴滴则是这个类的一个实例对象也可以隐藏 实例 这个称呼“酱油”是一个类海天酱油 则是一个对象“车”是一个类奔驰车则是一个对象。
细心的你不难发现类与对象本质上是抽象与具象的关系对象在类的基础上进行了适当的具象。所以在某个抽象关系中的对象也可能会成为另一个抽象关系中的类。比如上面奔驰车是车的一个对象那同样可能存在奔驰车是一个类而 S350L 是一个对象。
2Python 中的类
理解了类与对象现在我们来看一下 Python 中的类我们在开头的例子中提到类是用来把有联系的数据和函数给组织起来的一种方式。
在类中数据被称为属性而函数则被称为方法。每个类都可以有零个或者多个属性也可以有零个或者多个方法。
类的属性和方法的概念也很适合用来描述现实世界比如“人”这个类身高、体重、年龄等就是属性而走路、吃饭、打球 等动作就是方法。
接下来我们通过一个例子来演示怎么定义类怎么使用类。
3定义一个“人”的类
现在我们尝试定义一个人的类。需要有年龄、性别、姓名三个属性并提供两个方法introduce 方法打印一句介绍自己的话。get_age 方法返回当前对象的 age。
# 类的定义环节class Person:def __init__(self):self.name self.age 0self.gender def introduce(self):print(Hello, 我是 self.name)print(我今年 str(self.age) 岁)print(另外, 我是 self.gender)def get_age(self):return self.age# 使用上面定义的类xm Person()xm.name 小明xm.age 25xm.gender 男生print(xm.get_age())xm.introduce()
简单说一下上面的代码的主要逻辑
在定义环节 定义了一个类Person类名首字母用大写并用 init 函数中初始化了三个属性nameagegender。init 函数前后都有两个下划线代表初始化函数。简单来说就是当我们创建这个类的对象的时候这个函数会被自动执行不用你再手动执行一下定义了 introduce 方法会把几个属性的值组合成一段自我介绍这里我们通过方法参数 self.属性名 的形式来拿到类的属性的值。这种形式叫作**点语法。**点语法的本质就是找点前面的对象拿点后面的属性的值。比如 A.B 代表 A对象的B属性的值。定义了 get_age 方法把当前对象的 age 对象的值返回。可以看到无论是 introduce 方法 还是 get_age 方法都有一个 self 参数。这是 Python 的语法规定类的方法的第一个参数都必须是 self。这样方法内部就能通过对 self 使用点语法来获取属性的值。 使用环节 注意从我们使用的类的代码开始我们这里就没有缩进。因为有缩进就会被认为还是在类的内部但这里的代码是在外部的所以不用缩进我们创建了一个 Person 对象存在变量 xm 中之后逐一给它的属性赋值打印 xm 对象的 get_age 方法返回的值调用 xm 对象的 introduce
运行后输出如下所示 25Hello, 我是小明我今年 25 岁另外, 我是男生
可以看到通过类的机制我们成功地把数据和函数绑定在了一起。比如上面例子的数据name、age、gender 和函数get_age、introduce。并且类提供了一种机制self 参数能够让类的方法可以访问类的属性。
4给属性赋值
回看刚刚的例子我们创建了 Person 类的对象之后逐一对他的属性赋值每一次属性赋值都需要针对 xm 对象使用点语法比较麻烦有没有更好的方式呢 答案是肯定的。 我们稍微改造一下刚才的例子改造后的代码如下所示
class Person:def __init__(self, name, age, gender):self.name nameself.age ageself.gender genderdef introduce(self):print(Hello, 我是 self.name)print(我今年 str(self.age) 岁)print(另外, 我是 self.gender)def get_age(self):return self.agexm Person(小明, 25, 男生)print(xm.get_age())xm.introduce()
执行之后输出和刚才是一致的
25Hello, 我是小明我今年 25 岁另外, 我是男生
不同在哪儿呢是这里。 现在我们不需要进行逐个属性的赋值而是在构造对象的阶段就完成了几个属性的初始化。
这其中的奥妙就在 init 方法里我们给 init 函数加了参数然后用这些参数直接在 __init__的函数体中给我们的属性赋值。这样直接在创建对象的时候把对应的值依次放在类名后的括号中用逗号分隔。就能实现一次性地给属性都赋值精简了代码。
2、常见的系统类
类和函数一样类同样也有 Python 的开发者们提前写好提供给我们使用的类一般称为系统类。上面举的例子都是我们自己实现的类下面来看一下常用的系统类。
1列表list
列表相信大家都不陌生在变量与数据类型文章中已经介绍过它是 Python 非常常用的数据类型。
这里介绍一下列表的基础使用代码如下
# 创建列表a [90,1,23, 15]# 访问某个元素(下表从 0 开始)print(Third number is ,a[2])# 使用 append 方法添加元素a.append(-1)print(After append: , a)# 删除某个位置的元素del a[1]print(After delete second number: , a)# 删除具体某个元素a.remove(15)print(After delete 15, a)# 排序,默认从小到大a.sort()print(After sort, a)# 逆排序从大到小a.sort(reverse True)print(After reverse sort, a)# 求长度print(Length: , len(a))
上面主要方法都有注释这里不再展开你可以结合以下输出和代码加深理解。重要的是你要知道如果之后让你做某个事删除、排序等你能直接使用 list 类对应的方法。而不需要自己写循环完成。
Third number is 23After append: [90, 1, 23, 15, -1]After delete second number: [90, 23, 15, -1]After delete 15 [90, 23, -1]After sort [-1, 23, 90]After reverse sort [90, 23, -1]Length: 3
2字符串string
字符串我们用的也是非常多的在之前也介绍过一些基础用法比如用 号来连接两个字符串这里我们再介绍额外的一些用法。
a Hello,this is my home,welcome# 添加字符a a ,ppprint(\nAfter append pp:\n, a)# 删除前 x 个字符比如 3a a[3:]print(\nAfter remove first 3 characters:\n, a)# 删除固定内容的字符a a.replace(my,)print(\nAfter remove my:\n, a)# 替换固定内容成另外一个字符串a a.replace(home, company)print(\nAfter replace home to company:\n,a)# 用某个字符分割字符串返回一个数组比如逗号str_list a.split(,)print(\nList split from string by comma:\n, str_list)
输出
After append pp:Hello,this is my home,welcome,ppAfter remove first 3 characters:lo,this is my home,welcome,ppAfter remove my:lo,this is home,welcome,ppAfter replace home to company:lo,this is company,welcome,ppList split from string by comma:[lo, this is company, welcome, pp]
3、字典dict
字典和列表、字符串一样也是 Python 中相对常用的数据类型同样也是系统类。因为复杂一些所以在变量与数据类型文章中没有介绍。
字典和列表类似也是存储多个变量的容器。但与列表不同的是字典存储的不仅仅只有变量还有变量之间的映射关系。
我们举个例子假设我们要存储班级里三位同学的年龄可以用列表来完成比如 a [17, 18, 15], 但如果我们不仅要存储年龄还得存储这三位同学的名字。那用列表就无能为力了。
简单来说我们希望存储一个名字-年龄的映射关系。在这个例子上就是要存储这种形式的数据小明17小红18小江15。在 Python 中这种有对应关系的两个变量我们称之为键值对。比如小明就是 键(key)而 17 就是值value一个键会唯一对应到一个值。
这里我们希望存储的就是三个键值对。而字典就是专门用来存储键值对的容器。
# 创建一个空字典用 花括号 {}d {}print(Empty dict:, d)# 用键值对创建字典键和值中间用冒号隔开不同的键值对用逗号隔开d {xiaoming : 3.5 , xiaohong: 4}print(Two key-value pair dict:, d)# 访问字典的元素和列表一样用中括号但传入 key查询 value。比如查询 xiaoming 的年龄print(Xiaomings company age:, d[xiaoming])# 添加新的键值对直接对 key 对应的 value 赋值即可d[xiaogang] 5.5print(After append xiaogang:, d)# 删除键值对类似列表删除只是中括号内写 key而不是序号del d[xiaohong]print(After remove xiaohong:, d)# 修改键值对同添加一样直接对某个已有的 key 重新赋值即可d[xiaoming] 9.3print(After change xiaomings value:, d)
输出
Empty dict: {}Two key-value pair dict: {xiaoming: 3.5, xiaohong: 4}Xiaomings company age: 3.5After append xiaogang: {xiaoming: 3.5, xiaohong: 4, xiaogang: 5.5}After remove xiaohong: {xiaoming: 3.5, xiaogang: 5.5}After change xiaomings value: {xiaoming: 9.3, xiaogang: 5.5}
3、实战
现在有个任务记录部门信息每个部门都需要统计部门名称员工列表部门主管等信息。另外还有两个要求1、部门员工入职和离职都能方便的更新信息2、可以方便查看某个部门的汇总信息。
问题分析
目前我们需要记录的信息都是围绕部门这个实体的所以我们可以用一个部门的类来记录部门名称、员工列表和部门主管则都是这个类的属性。另外的要求是有人员变动的时候方便更新信息那其实就是部门类需要提供增加人员和减少人员的方法。最后一个要求是方便查看部门汇总那其实就是需要一个打印方法来把部门的属性都打印出来。
我们接下来一步步来实现它。
1创建部门类
我们首先创建部门类和它的属性部门名称和主管姓名是字符串类型的变量这两个属性我们通过初始化函数的参数来初始化。而员工列表是一个列表类型我们先把它初始化成一个空列表。
class Department:def __init__(self, dep_name, boss_name):self.dep_name dep_nameself.boss_name boss_nameself.stuff_list []
2实现员工的新增方法
目前员工列表也就是 stuff_list 属性还是空列表为了实现往这个列表增加员工的名字我们需要在部门类增加一个添加员工的方法我们就命名为 add_stuff。这个方法除了类方法必须带的 self 参数之外只有一个参数要添加的员工的姓名。
然后方法里面只需要把这个姓名添加到 stuff_list 即可添加数据到列表只需要调用列表对象的 append 方法即可。
class Department:def __init__(self,dep_name, boss_name):self.dep_name dep_nameself.boss_name boss_nameself.stuff_list []# 新增代码def add_stuff(self, name):self.stuff_list.append(name)
3实现删除员工的方法
部门会新增员工比如员工入职或者调入。也可能会减少员工比如员工离职比如转岗去其他部门所以我们同样需要一个删除员工的方法。
类似添加员工的设计删除员工的方法同样需要员工姓名的参数在方法内部调用 stuff_list 对象的 remove 方法来将员工从列表中移除。
class Department:def __init__(self,dep_name, boss_name):self.dep_name dep_nameself.boss_name boss_nameself.stuff_list []def add_stuff(self, name):self.stuff_list.append(name)# 新增代码def remove_stuff(self, name):self.stuff_list.remove(name)
4添加打印部门信息的方法
打印部门信息就是将部门的三个属性直接打印出来比较简单这里我们直接实现
class Department:def __init__(self,dep_name, boss_name):self.dep_name dep_nameself.boss_name boss_nameself.stuff_list []def add_stuff(self, name):self.stuff_list.append(name)def remove_stuff(self, name):self.stuff_list.remove(name)# 打印部门信息def print_dep_info(self):print(部门名称,self.dep_name);print(主管名称,self.boss_name);#这里使用上一篇文章中说到的len()函数来计算部门人数print(员工共个:,len(self.stuff_list));print(分别是,self.stuff_list);
5使用部门类
现在我们的部门类已经开发完毕了现在让我们来用一用它看看它是不是好使。
首先是记录部门信息假设现在先记录2个部门技术部和财务部。首先要分别创建两个部门的对象
#创建技术部和财务部
it_dep Department(技术部,小江);
finance_dep Department(财务部,小红);#给技术部添加两个员工
it_dep.add_stuff(小江1);
it_dep.add_stuff(小江2);#给财务添加两个员工
finance_dep.add_stuff(小红1);
finance_dep.add_stuff(小红2);
#打印技术部和财务部信息
it_dep.print_dep_info();
finance_dep.print_dep_info();
执行后输出
部门名称 技术部
主管名称 小江
员工共个: 2
分别是 [小江1, 小江2]
部门名称 财务部
主管名称 小红
员工共个: 2
分别是 [小红1, 小红2]最后当有人需要离职时只需要调用 remove_stuff 方法即可假设 技术部的小江2决定去创业要离职我们需要将他从部门列表中移除。
it_dep.remove_stuff(小江2)it_dep.print_dep_info()
输出
部门 技术部主管 小江员工共个1员工 [小江1]
可以看到小江2已经不在员工列表中了。
至此我们通过类与对象的方法完成了部门信息统计的任务并且可以非常方便地处理员工增加和减少的场景。