使用类和实例

视频

在此处找到本课程的视频:

25.1 使用类和实例

你可以使用类来模拟现实世界中的很多情景。类编写好后,你的大部分时间都将花在使用根据类创建的实例上。你需要执行的一个重要任务是修改实例的属性。

  1. Car类
    下面来编写一个表示汽车的类,它存储了有关汽车的信息,还有一个汇总这些信息的方法:
    car.py

    class Car(): """一次模拟汽车的简单尝试""" def __init__(self, make, model, year):"""初始化描述汽车的属性""" self.make = make self.model = model self.year = year def get_descriptive_name(self):"""返回整洁的描述性信息""" long_name = str(self.year) + ' ' + self.make + ' ' + self.model return long_name.title()
    my_new_car = Car('audi', 'a4', 2016)
    print(my_new_car.get_descriptive_name())
    

    第3行:定义了方法__init__()。第一个形参为self;方法中包含了另外三个形参:make、model和year。方法__init__()接受这些形参的值,并将它们存储在根据这个类创建的实例的属性中。创建新的Car实例时,需要指定其制造商、型号和生产年份。
    第8行:定义了名为get_descriptive_name()的方法,它使用属性year、make和model创建一个对汽车进行描述的字符串。为了访问属性的值,使用了self.makeself.modelself.year

    第12行,根据Car类创建了一个实例,并将其存储到变量my_new_car中。接下来,调用方法get_descriptive_name(),指出是一辆什么样的汽车:

    2016 Audi A4

    为让这个类更有趣,下面给它添加一个随时间变化的属性,它存储汽车的总里程。

    类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。在有些情况下,如设置默认值时,需要在方法__init__()内指定初始值;这样就无需包含为它提供初始值的形参。

    下面来添加一个名为odometer_reading属性,其初始值总是为0。还添加了一个名为read_odometer()的方法,用于读取汽车的里程表:

    class Car(): """一次模拟汽车的简单尝试""" def __init__(self, make, model, year):"""初始化描述汽车的属性""" self.make = make self.model = model self.year = year self.odometer_reading = 0def get_descriptive_name(self):"""返回整洁的描述性信息""" long_name = str(self.year) + ' ' + self.make + ' ' + self.model return long_name.title() def read_odometer(self):"""打印一条指出汽车里程的消息""" print("This car has " + str(self.odometer_reading) + " miles on it.") my_new_car = Car('audi', 'a4', 2016)
    print(my_new_car.get_descriptive_name())
    my_new_car.read_odometer()
    

    现在,当创建新实例时,将像前一个示例一样以属性的方式存储制造商、型号和生产年份。接下来,Python将创建一个名为odometer_reading的属性,并将其初始值设置为0。

    第13行:还定义了一个名为read_odometer()的方法,用它能够轻松地获悉汽车的里程。
    一开始汽车的里程为0:

2016 Audi A4
This car has 0 miles on it.

修改属性值

出售时里程表读数为0的汽车并不多,因此需要一个修改该属性的值的途径。

可以以三种不同的方式修改属性的值:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加特定的值)。下面依次介绍这些方法。

  1. 直接修改属性的值
    要修改属性的值,最简单的方式是通过实例直接访问它。下面的代码直接将里程表读数设置为23:

    my_new_car = Car('audi', 'a4', 2016)
    print(my_new_car.get_descriptive_name()) my_new_car.odometer_reading = 23
    my_new_car.read_odometer()
    

    第4行,使用句点表示法来直接访问并设置汽车的属性odometer_reading。这行代码让Python在实例my_new_car中找到属性odometer_reading,并将该属性的值设置为23:

    2016 Audi A4
    This car has 23 miles on it.

    有时候需要像这样直接访问属性,但其他时候需要编写对属性进行更新的方法。

  2. 通过方法修改属性的值
    如果有替你更新属性的方法,将很方便。这样,你就无需直接访问属性,而可将值传递给一个方法,由它在内部进行更新。
    下面的示例演示了一个名为update_odometer()的方法:

    class Car(): """一次模拟汽车的简单尝试""" def __init__(self, make, model, year):"""初始化描述汽车的属性""" self.make = make self.model = model self.year = year self.odometer_reading = 0def get_descriptive_name(self):"""返回整洁的描述性信息""" long_name = str(self.year) + ' ' + self.make + ' ' + self.model return long_name.title() def read_odometer(self):"""打印一条指出汽车里程的消息""" print("This car has " + str(self.odometer_reading) + " miles on it.") def update_odometer(self, mileage):"""将里程表读数设置为指定的值""" self.odometer_reading = mileage my_new_car = Car('audi', 'a4', 2016)
    print(my_new_car.get_descriptive_name())
    my_new_car.update_odometer(23)
    my_new_car.read_odometer()
    

    对Car类所做的唯一修改是在第16行添加了方法update_odometer()。这个方法接受一个里程值,
    并将其存储到self.odometer_reading中。第23行,调用了update_odometer(),并向它提供了 实参23。它将里程表读数设置为23;而方法read_odometer()打印该读数:

    2016 Audi A4
    This car has 23 miles on it.

    可对方法update_odometer()进行扩展,使其在修改里程表读数时做些额外的工作。下面来添加一些逻辑,禁止任何人将里程表读数往回调:

    class Car(): """一次模拟汽车的简单尝试""" def __init__(self, make, model, year):"""初始化描述汽车的属性""" self.make = make self.model = model self.year = year self.odometer_reading = 0def get_descriptive_name(self):"""返回整洁的描述性信息""" long_name = str(self.year) + ' ' + self.make + ' ' + self.model return long_name.title() def read_odometer(self):"""打印一条指出汽车里程的消息""" print("This car has " + str(self.odometer_reading) + " miles on it.")def update_odometer(self, mileage): """ 将里程表读数设置为指定的值 禁止将里程表读数往回调 """ if mileage >= self.odometer_reading: self.odometer_reading = mileage else: print("You can't roll back an odometer!")
    

    现在,update_odometer()在修改属性前检查指定的读数是否合理。如果新指定的里程(mileage)大于或等于原来的里程(self.odometer_reading),就将里程表读数改为新指定的里程;否则就发出警告,指出不能将里程表往回拨。

  3. 通过方法对属性的值进行递增
    有时候需要将属性值递增特定的量,而不是将其设置为全新的值。假设购买了一辆二手车,且从购买到登记期间增加了100英里的里程,下面的方法让能够传递这个增量,并相应地增加里程表读数:

    class Car(): --snip--def increment_odometer(self, miles):"""将里程表读数增加指定的量""" self.odometer_reading += miles my_used_car = Car('subaru', 'outback', 2013)
    print(my_used_car.get_descriptive_name())
    my_used_car.update_odometer(23500)
    my_used_car.read_odometer()
    my_used_car.increment_odometer(100)
    my_used_car.read_odometer()
    

    第3行:新增的方法increment_odometer()接受一个单位为英里的数字,并将其加入到self.odometer_reading中。第8行,创建了一辆二手车——my_used_car。第10行,调用
    方法update_odometer()并传入23500,将这辆二手车的里程表读数设置为23500。第12行,调
    increment_odometer()并传入100,以增加从购买到登记期间行驶的100英里:

    2013 Subaru Outback
    This car has 23500 miles on it.
    This car has 23600 miles on it.

    你可以轻松地修改这个方法,以禁止增量为负值,从而防止有人利用它来回拨里程表。

    注意: 你可以使用类似于上面的方法来控制用户修改属性值(如里程表读数)的方式,但能够访问程序的人都可以通过直接访问属性来将里程表修改为任何值。要确保安全,除了进行类似于前面的基本检查外,还需特别注意细节。

Python基础:第25课——使用类和实例相关推荐

  1. 青少年编程python一节课多长时间_10节免费少儿编程微课:Python基础知识微课

    课程介绍课程名称:Python基础知识微课(10节) 课程内容:通过对Python基础知识的讲解,教孩子们学会使用海龟编辑器进行编程,了解Python的基础知识,学完课程之后,孩子们可以用海龟编辑器快 ...

  2. 清华大学python基础_清华大学出版社-图书详情-《Python基础入门-微课视频版》

    前言 Python语言自从20世纪90年代初诞生至今,逐渐被广泛应用于处理系统管理任务和科学计算,是最受欢迎的程序设计语言之一. 学习编程是工程专业学生学习的重要部分.除了直接的应用外,学习编程还是了 ...

  3. python基础实例教程 微课版-清华大学出版社-图书详情-《Python基础入门-微课视频版》...

    前言 Python语言自从20世纪90年代初诞生至今,逐渐被广泛应用于处理系统管理任务和科学计算,是最受欢迎的程序设计语言之一. 学习编程是工程专业学生学习的重要部分.除了直接的应用外,学习编程还是了 ...

  4. Python基础第三课-基本数据类型

    Python基础第三课-基本数据类型 1.几个基本概念 1.1 表达式 1.2 语句 1.3 程序(program) 1.4 函数(function) 2.标识符 2.1 关键字 2.2 标识符概念 ...

  5. python命令行参数解析OptionParser类用法实例

    python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下:     from opt ...

  6. Swift基础语法: 25 - Swift的类和结构体

    在我们实际开发的过程中, 类和结构体是人们创建代码时所用的一种通用且灵活构造体, 为了在类和结构体中实现各种功能,我们必须要严格按照对于常量,变量以及函数所规定的语法规则来定义属性和添加方法. 但是在 ...

  7. python基础(14)之 类和对象

    目录 Python类和对象 一.创建类 二.创建对象 三.init() 函数 四.对象方法 五.自参数 六.对象及其属性更改 七.pass语句 Python类和对象 Python 类/对象.Pytho ...

  8. python基础(25):StringIO和BytesIO 序列化

    StringIO和BytesIO - 廖雪峰的官方网站 (liaoxuefeng.com) 目录 StringIO BytesIO 小结 操作文件和目录 环境变量 操作文件和目录 小结 练习 序列化 ...

  9. Python基础篇(六)-- 类和对象

    Python语言在设计之初,就定位为一门面向对象的编程语言,而面向对象编程(Object-oriented Programming,简称 OOP),是一种封装代码的方法.比较正式的说法,"把 ...

  10. 小牛叔讲Python第12章:面向对象类与实例(Class入门)

    上一篇:小牛叔讲Python第11章:函数的高级用法以及匿名函数 下一篇:小牛叔讲Python第13章:类Class中的各种变量类型 小牛叔用轻松有趣的故事,带你进入Python的编程世界. 1.类 ...

最新文章

  1. 阿里专家讲中台:技术中台-分布式架构在蚂蚁金服的实践
  2. OJ在线编程----常见输入输出练习场
  3. 用户故事与敏捷方法阅读笔记03
  4. 网站架构演变和知识体系
  5. C语言中执行python代码或源程序文件(高级嵌入方式)
  6. HR怼程序员频繁跳槽,程序员竟这么回怼
  7. Python实现图像直方图均衡化算法
  8. 升级 webpack4 变化之处
  9. 物联网:发动一场生态系革命
  10. Win10无法访问Ubuntu18.04的smb解决
  11. 基于单片机的电子密码锁的实现
  12. 小盒即时通讯IM-全套开源-开箱即用
  13. 两年数据对比柱形图_办公小技巧:让Excel图表对比更轻松
  14. python爬取站酷海洛图片_站酷海洛图片爬取
  15. 音频和视频标签 与其他标签
  16. ZJM与生日礼物【字典树】
  17. 计算机组成原理:VHDL设计微程序控制器(代码通俗易懂)
  18. jar 打包java文件
  19. pyecharts geo绘制地理信息地图
  20. 戏子多秋用计算机怎么弹,戏子多秋 - 刘雨Key - 5SING中国原创音乐基地

热门文章

  1. 电脑蓝屏按哪三个键恢复?怎么修复蓝屏问题
  2. iview中的Select选择器
  3. windows10下使用mencoder将y4m文件转换为YUV文件
  4. 80个让你笑爆肚皮的程序员段子,不好笑算我输!
  5. 年轻人,你为什么要来阿里搞技术?
  6. BZOJ 2429: [HAOI2006]聪明的猴子
  7. 从美术生到程序员转型之路【我的故事】
  8. 双非计算机研究生要不要读,“双非”大学研究生,到底值不值得读?
  9. 百度统计 页面代码安装状态:代码未生效 解决
  10. 使用命令结束Linux系统