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=9
stu=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对象x
x.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对象x
x.m=5 # 给x动态增加一个属性m并赋值为5
x.n=6
print(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
    身高height
    11.创建一个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>