第9章 类
9.1 创建和使用类
1.类表示描述某种事务的状态动作信息
2.实例表示生成的类对象例子
9.1.1 创建 Dog 类
·方法init()相当于类的初始化操作,类似于Java的构造方法
9.1.2 根据类创建实例
1.函数进行实例创建的时候都会执行初始化方法
2.对象.属性/方法()这种语句进行调用一个类的属性和方法
3.一个对象能够创建多个实例,实例之间互不影响
动手试一试
9-1 餐馆:创建一个名为 Restaurant 的类,其方法__init__()设置两个属性:
restaurant_name 和 cuisine_type。创建一个名为 describe_restaurant()的方法和一个
名为 open_restaurant()的方法,其中前者打印前述两项信息,而后者打印一条消息,
指出餐馆正在营业。
根据这个类创建一个名为 restaurant 的实例,分别打印其两个属性,再调用前述
两个方法。
9-2 三家餐馆:根据你为完成练习 9-1 而编写的类创建三个实例,并对每个实例调
用方法 describe_restaurant()。
9-3 用户:创建一个名为 User 的类,其中包含属性 first_name 和 last_name,还有
用户简介通常会存储的其他几个属性。在类 User 中定义一个名为 describe_user()的方
法,它打印用户信息摘要;再定义一个名为 greet_user()的方法,它向用户发出个性化
的问候。
创建多个表示不同用户的实例,并对每个实例都调用上述两个方法
9.2 使用类和实例
9.2.1 Car 类
1.同样第一个形参是self,init()方法接收这些形参的值,并将他们存储在根据这个类创建的实例属性中
9.2.2 给属性指定默认值
1.有一些属性我们可以初始化的时候设定,但是要有方法针对该属性修改的操作
9.2.3 修改属性的值
1.直接修改属性值,根据实例进行访问属性赋值
2.创建一个方法进行修改该属性的值,可以反复调用
动手试一试
9-4 就餐人数:在为完成练习 9-1 而编写的程序中,添加一个名为 number_served
的属性,并将其默认值设置为 0。根据这个类创建一个名为 restaurant 的实例;打印有
多少人在这家餐馆就餐过,然后修改这个值并再次打印它。
添加一个名为 set_number_served()的方法,它让你能够设置就餐人数。调用这个
方法并向它传递一个值,然后再次打印这个值。
添加一个名为 increment_number_served()的方法,它让你能够将就餐人数递增。
调用这个方法并向它传递一个这样的值:你认为这家餐馆每天可能接待的就餐人数。
9-5 尝试登录次数:在为完成练习 9-3 而编写的 User 类中,添加一个名为
login_attempts 的属性。编写一个名为 increment_login_attempts()的方法,它将属性
login_attempts 的值加 1。再编写一个名为 reset_login_attempts()的方法,它将属性
login_attempts 的值重置为 0。
根据 User 类创建一个实例,再调用方法 increment_login_attempts()多次。打印属
性 login_attempts 的值,确认它被正确地递增;然后,调用方法 reset_login_attempts(),
并再次打印属性 login_attempts 的值,确认它被重置为 0。
9.3 继承
1.一个类继承另一个类时,它将自动获得另一个类的所有属性和方法
2.被继承的类是父类,继承的类是子类
3.子类除了拥有父类属性和方法,还可以自己扩展属性和方法
9.3.1 子类的方法__init__()
1.创建子类的时候,子父类必须包含在同一个文件,且位于子类的之前
2.super代表调用父类的语法,父类也称超类
9.3.3 给子类定义属性和方法
1.为子类添加属性和方法,当我们进行初始化的时候对属性赋值,和方法的声明
9.3.4 重写父类的方法
1.子类重写父类方法,当使用子类实例进行方法调用,子类的方法会覆盖父类的方法
2.如果想要使用父类被重写的方法,必须用父类的实例进行方法调用
9.3.5 将实例用作属性
1.属性和方法清单进行归类可以新建一个类
2.调用主类的时候可以讲包装的类当作是一个属性调用进主类中
9.3.6 模拟实物
动手试一试
9-6 冰淇淋小店:冰淇淋小店是一种特殊的餐馆。编写一个名为 IceCreamStand 的
类,让它继承你为完成练习 9-1 或练习 9-4 而编写的 Restaurant 类。这两个版本的
Restaurant 类都可以,挑选你更喜欢的那个即可。添加一个名为 flavors 的属性,用于
存储一个由各种口味的冰淇淋组成的列表。编写一个显示这些冰淇淋的方法。创建一个
IceCreamStand 实例,并调用这个方法。
9-7 管理员:管理员是一种特殊的用户。编写一个名为 Admin 的类,让它继承你为
完成练习 9-3 或练习 9-5 而编写的 User 类。添加一个名为 privileges 的属性,用于存
储一个由字符串(如"can add post"、"can delete post"、"can ban user"等)组成的
列表。编写一个名为 show_privileges()的方法,它显示管理员的权限。创建一个 Admin
实例,并调用这个方法。
9-8 权限:编写一个名为 Privileges 的类,它只有一个属性——privileges,其中
存储了练习 9-7 所说的字符串列表。将方法 show_privileges()移到这个类中。在 Admin
类中,将一个 Privileges 实例用作其属性。创建一个 Admin 实例,并使用方法
show_privileges()来显示其权限。
9-9 电瓶升级:在本节最后一个 electric_car.py 版本中,给 Battery 类添加一个名为
upgrade_battery()的方法。这个方法检查电瓶容量,如果它不是 85,就将它设置为 85。
创建一辆电瓶容量为默认值的电动汽车,调用方法 get_range(),然后对电瓶进行升级,
并再次调用 get_range()。你会看到这辆汽车的续航里程增加了。
9.4 导入类
9.4.1 导入单个类
1.python允许将类存储在模块中通过主程序进行导入引用
2.通过导入类可以使代码简洁
9.4.3 从一个模块中导入多个类
1.如果同一个模块有多个类,我们可以一次性进行导入
9.4.4 导入整个模块
1.导入的时候是导入模块名
9.4.5 导入模块中的所有类
1.不推荐使用这样导入类,因为会潜在与别的导入类同名,引发错误
9.4.6 在一个模块中导入另一个模块