8.1 类和对象
一.什么是类
我们学习过基本变量类型,例如int,float,str等,它们可以表达一些简单的值,例如一个数字,一个字符,对于复杂的事物就不能描述了,例如,一个学生,一个班级。
类就是为了解决这样的问题。
什么是类呢?
简单说类可以看做是自定义的变量类型。就和int一样,你可以把类看做是复杂一点的变量类型。
首先一个类可以有多个属性,例如一个矩形类,就需要长和宽两个数值。
然后类可以有行为,例如一个汽车类,它有开车,停车这样的行为。
类是一类事物的抽象。
类的属性用来是描述这个事物 。
类的行为是这个事物的功能或动作。
类是一类事物的抽象,而对象,就是具体的某个事物。
下面是一个类Student的定义:
class Student: name="" id="" clazz=""
定义一个类很简单,先写上关键字class,然后是类的名字(通常是大写),然后冒号,接着在缩进部分定义变量,一个简单的类就定义好了,上面的name,id以及clazz都是类Student的属性。
二.类和对象
万事万物皆对象。(Everything is an object)
这是经典的《Java编程思想》的一个章节名,任何事物,都可以看做是某种类一个对象。
类和对象的关系,就是抽象和具体的关系。 两者的层面不一样:类规定有些什么属性和行为,包括它们的类型和名字;对象则是这个类具体的一个实例,它有自己的属性值。
马是一个类,这匹马就是一个对象,那匹马也是一个对象。
下面是一个类Stduent的定义,以及对象stu的创建
class Student: name="" id="" clazz=""i=9stu=Student()#给stu对象的属性赋值stu.name="张三"stu.id="AP98773938"stu.clazz="23计算机应用3班"i是变量,根据它的整数值,此时i是整型变量。
Student是一个类,而stu就是对象,对象的地位相当于变量。
我们回到最初的变量: i=7,i是变量,7是值。这些变量类型是最基本的类型,它们可以组成更复杂的数据,从而创造一个并不存在的数据类型。
存不存在一个代表“手机”的变量类型? 不存在,但是我们可以自己创建。 类就是为解决这个问题而诞生的。
类可以看做是自定义的变量类型。对象就是类的一个变量,或者说是一个实例。在面向对象的世界里,最小的数据单元从基本变量变成了对象。
三.属性
类有很多属性,我们可以根据需要给类添加属性。下面这个一个“手机类”的定义。
class Mobile: name='' mon=''x=Mobile()# 定义一个Mobiel对象xx.name="iphone14" # 给x的name属性赋值x.mon="1980*1200" # 给x的mon属性赋值print(x.name) name和mon这两个就是类Mobile的两个属性,又称为成员变量。
然后我们可以定义了一个Mobile类型的变量x,我们称这样的变量为对象,还可以给m的属性赋值,我们称m为Mobile的一个对象。
Mobile是抽象的,m是具体,类和对象的关系就好比:马和“这一匹马”的关系。
类定义了事物的属性和行为,而对象就是具体某一个事物,对象需要给这些属性值赋值。 例如学生是一个类,它有学号、姓名、班级这三个属性,那么某个对象这三个属性就应该有具体的值。例如某个学生张三,学号2022040511,22软件1班。
stu=Student()stu.name='张三'stu.id='2022040511'stu.clazz='22软件1班'一个类可以有很多对象,每个对象都有它自己的属性。就好比可以有无数的变量,它的变量i和j的值是互相独立的。 对比普通变量,对象更进一步,每个对象都有自己的属性值,每个对象的行为都可能会有不同的结果。
例如下面的代码,stu和stu2是Student类两个对象,它们可以用不同的属性值,互不干扰
stu=Student()stu.name='张三'stu.id='2022040511'stu.clazz='22软件1班'stu2=Student()stu2.name='李四'stu2.id='2022080311'stu2.clazz='22网络3班'四.对象动态添加属性
python还支持动态添加属性,例如:
class X:pass #定义类X,但里面什么属性都没有x=X() # 声明一个X对象xx.m=5 # 给x动态增加一个属性m并赋值为5x.n=6print(x.m)print(x.n)练习题
-
类的属性和行为1.判断下面哪个是汽车这个类的属性 (2分) [选择]A.
B. 车启动
C. 车的长度
D. 车停止
E. 车换挡2.哪个是电视机这个类的行为 (2分) [选择]A.
B. 长度
C. 宽度
D. 换台
E. 是否有数字电视接口3.班级是一个类,那么班级名称是属性 (2分) [判断]4.学生是一个类,那么毕业是一个属性 (2分) [判断]5.学生是一个类,那么是否毕业是一个属性 (2分) [判断]6.类的定义是用于程序需要,我们只抽象我们需要的属性和行为,下面的属性对于一个游戏角色来说,哪个是不合适的 (2分) [选择]A.
B. 性别
C. 种族
D. 是否有头发
E. 是否有近视7.下面的行为对于一个游戏角色来说,哪个是不合适的 (2分) [选择]A.
B. 跑步
C. 释放技能
D. 思考
E. 进食8.对于一个学生管理系统来说,下面哪个属性不太可能出现在学生管理系统 (2分) [选择]A.
B. 学号
C. 姓名
D. 籍贯
E. 是否会跳舞9.定义一个类,类名是Student。 (10分) [编程]不需要任何属性10.给上面定义的Student类添加属性 (10分) [编程]五个属性:
姓名name
年龄age
性别gender
班级clazz
身高height11.创建一个Student对象stu (10分) [编程]定义Student,创建一个Student对象stu,设置stu的name属性为李四、年龄age为13和班级clazz为“三年二班” -
判断下面的类的定义和使用是否正确1. (2分) [判断]
<code><div class='codeNewLine'><span class='keyword'>class</span> Mobile;</div><div class='codeNewLine'> name;</div><div class='codeNewLine'> mon;</div></code>2.Computer类有两个属性,分别是name和device (2分) [判断]<code><div class='codeNewLine'><span class='keyword'>class</span> Computer:</div><div class='codeNewLine'> name=<span class='string'>""</span></div><div class='codeNewLine'></div><div class='codeNewLine'>device=<span class='string'>""</span></div><div class='codeNewLine'></div></code>3. (2分) [判断]<code><div class='codeNewLine'><span class='keyword'>class</span> Book:</div><div class='codeNewLine'> name=<span class='string'>""</span></div><div class='codeNewLine'> isbn=<span class='string'>""</span></div><div class='codeNewLine'> name</div></code>4. (2分) [判断]<code><div class='codeNewLine'><span class='keyword'>class</span> TV: </div><div class='codeNewLine'></div><div class='codeNewLine'> channel=<span class='string'>''</span></div><div class='codeNewLine'> mon=<span class='string'>''</span></div><div class='codeNewLine'></div><div class='codeNewLine'>tv=TV()</div><div class='codeNewLine'>tv.mon=<span class='string'>"25寸曲面屏"</span></div><div class='codeNewLine'><span class='pyFunction'>print</span>(tv.mon)</div></code>5. (2分) [判断]<code><div class='codeNewLine'><span class='keyword'>class</span> TV: </div><div class='codeNewLine'></div><div class='codeNewLine'> channel=<span class='string'>''</span></div><div class='codeNewLine'> mon=<span class='string'>''</span></div><div class='codeNewLine'></div><div class='codeNewLine'>tv=TV()</div><div class='codeNewLine'>tv.channel=<span class='string'>"ISTN"</span></div><div class='codeNewLine'>tv.mon=<span class='string'>"65寸"</span></div><div class='codeNewLine'><span class='pyFunction'>print</span>(tv.channel+tv.mon);</div></code>6. (2分) [判断]<code><div class='codeNewLine'><span class='keyword'>class</span> Book: </div><div class='codeNewLine'> name=<span class='string'>''</span> </div><div class='codeNewLine'> isbn=<span class='string'>''</span> </div><div class='codeNewLine'></div><div class='codeNewLine'></div><div class='codeNewLine'>book=Book() </div><div class='codeNewLine'></div><div class='codeNewLine'>book.name=<span class='string'>"Java编程思想"</span>; </div><div class='codeNewLine'></div><div class='codeNewLine'>book.author=<span class='string'>"Eckel Bruce"</span>;</div></code>