笔者从昨天开始感觉到了课程的难度,接下来不能简单的概括知识点。笔者将会按照书上的标题章节来整理知识点。这样看起来会更加直观。

9.1 创建类和使用类

9.1.1 创建Dog类

 1 class Dog():
 2     """一次模拟小狗的简单尝试"""
 3
 4     def __init__(self,name,age):
 5         """初始化属性name和age"""
 6         self.name = name
 7         self.age = age
 8
 9     def sit(self):
10         """模拟小狗被命令时蹲下"""
11         print(self.name.title() + " is now sitting.")
12
13     def roll_over(self):
14         """模拟小狗被命令时打滚"""
15         print(self.name.title() + " rolled over!")

根据约定,在Python中,首字母大写的名称指的是类。这个类定义中的括号是空的,因为我们要从空白创建这个类。

第2行是之前提到过的文档字符串,对这个类的功能做了描述。

1.方法_init_()

类中的函数称为方法;_init_()方法时候一个特殊的方法,每当你根据Dog类创建新实例时,Python都会自动运行它。开头和末尾的下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。

在这个方法的定义中,形参self必不可少,必须位于其他形参前面。原因:Python调用这个方法来创建Dog实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类的属性和方法。

self会自动传递,因此我们不需要传递它。每当我们创建实例时,只需要给最后两个形参提供值。

第6行和第7行定义了两个以self为前缀的变量,可供类中的所有方法使用,还可以通过类的任何实例来访问这些变量。self.name = name获取存储在形参name中的值,并将它存储到变量name中,然后该变量被关联到当前创建的实例。像这样可通过实例访问的变量称为属性。

2.在Python2.7中创建类

class ClassName(object):--ship--

9.1.2 根据类创建实例

可将类视为有关如何创建实例的说明。

下面来创建一个表示特定小狗的实例:

class Dog():--ship--my_dog = Dog('while', 6)print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is "+str(my_dog.age) + " years old")

方法_init_()并未显式地包含return语句,但Python自动返回一个表示这条小狗的实例。我们将这个实例存储在变量my_dog中。

1.访问属性

要访问实例的属性,可以使用句点表示方法。

2.调用方法

创建实例后,可以使用句点表示法来调用Dog类中定义的任何方法。

class Dog():--ship--my_dog = Dog('while', 6)
my_dog.sit()
my_dog.roll_over()

3.创建多个实例

my_dog = Dog('while', 6)
your_dog = Dog('lucy',3)print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is "+str(my_dog.age) + " years old")
my_dog.sit()print("\nYour dog's name is " + your_dog.name.title() + ".")
print("your dog is "+str(your_dog.age) + " years old")
your_dog.roll_over()

可以按需求根据一个类创建任意数量的实例,条件是将每个实例都存储在不同的变量中,或占用列表或字典的不同位置。

9.2 使用类和实例

9.2.1 Car 类,给属性指定默认值

类中的每个属性都必须有初始值。在有些情况下,如设置默认值时,在方法方法_init_()内指定这种初始值是可行的;如果你对某个属性这样做了,就无需包含为它提供初始值的形参。

class Car():"""一次模拟汽车的简单尝试"""def __init__(self,make,model,year):"""初始化描述汽车的属性"""self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):"""返回整洁的描述信息"""long_name = str(self.year) + ' ' + self.make + ' ' +self.modelreturn 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()

9.2.2修改属性的值

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

1.直接修改属性的值

my_new_car.odometer_reading = 23
my_new_car.read_odometer()

使用句点表示法来直接访问并设置汽车的属性odometer_reading。

2.通过方法修改属性的值

class Car():--ship--  def update_odometer(self,mileage):"""将里程表读数设置为指定的值"""self.odometer_reading = mileagemy_new_car = Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())my_new_car.update_odometer(23)
my_new_car.read_odometer()

3.通过方法对属性的值进行递增

class Car():--ship--def update_odometer(self,mileage):--ship--    def increament_odometer(self,miles):"""将里程表读数增加指定的量"""self.odometer_reading += milesmy_new_car = Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())my_new_car.update_odometer(23)
my_new_car.read_odometer()my_new_car.increament_odometer(100)
my_new_car.read_odometer()    

输出结果:

2016 Audi A4
This car has 23 miles on it
This car has 123 miles on it

9.3继承

编写类时,并非总要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新的类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

9.3.1 子类的方法_init_()

创建子类的实例时,Python首先需要完成的任务是给父类所有的属性赋值。为此子类的方法_init_()需要父类施以援手。

下面创建一个简单的ElectriCar类版本,它具备Car类的所有功能:

class Car():"""一次模拟汽车的简单尝试"""def __init__(self,make,model,year):"""初始化描述汽车的属性"""self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):"""返回整洁的描述信息"""long_name = str(self.year) + ' ' + self.make + ' ' +self.modelreturn 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 = mileagedef increament_odometer(self,miles):"""将里程表读数增加指定的量"""self.odometer_reading += miles
class ElectricCar(Car):"""电动车的独特之处"""def __init__(self,make,model,year):"""初始化父类的属性"""super().__init__(make,model,year)my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())

用粉红色标出的括号不能丢,否则会报错。出现:descriptor '__init__' requires a 'super' object but received a 'str' 的错误。

9.3.2 Python2.7中的继承

在Python2.7中,继承的语法稍有不同,ElectricCar类的定义类似于下面这样:

class Car(object):def_init_(self,make,model,year):--ship--class ElectricCar(Car):def_init_(self,make,model,year):super(ElectricCar,self)._init_(make,model,year)--ship--

函数super()需要两个实参:子类名和对象self。另外,在Python2.7中使用继承时,务必在定义父类时在括号内指定object。

9.3.3 给子类定义属性和方法

class Car():--ship--class ElectricCar(Car):"""电动车的独特之处"""def __init__(self,make,model,year):"""电动汽车的独特之处初始化父类的属性,再初始化电动汽车特有的属性"""super().__init__(make,model,year)self.battery_size = 70def describe_battery(self):"""打印一条描述电瓶容量的消息"""print("This car has a " + str(self.battery_size) + "-kwh battery.")my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()

输出结果:

2016 Tesla Model S
This car has a 70-kwh battery.

9.3.4 重写父类的方法

可以在子类中定义一个这样的方法,即它与要重写的父类方法同名。

假设Car类有一个名为fill_gas_tank()的方法,它对电动汽车毫无意义,因此可以重写它,下面演示了一种重写方式:

class ElectricCar():--ship--def fill_gas_tank(self):"""电动汽车没有邮箱"""print("This car doesn't need a gas tank!")

9.3.5 将实例用作属性

使用代码模拟实物时,属性和方法清单以及文件都越来越长。在这种情况下,可能需要将类的一部分作为一个独立的类提取出来。可以将大型类拆分成多个协同工作的小类。

例如,不断给ElectricCar添加细节时,可能会包含很多专门针对汽车电瓶的属性和方法。在这种情况下,我们可将这些属性和方法提取出来,放到另一个名为Battery的类中,并将一个Battery的实例用作ElectricCar()类的一个属性:

class Car():--ship--class Battery():"""一次模拟电动汽车电瓶的简单尝试"""def __init__(self,battery_size=70):"""初始化电瓶的属性"""self.battery_size = battery_sizedef describe_battery(self):"""打印一条描述电瓶容量的消息"""print("This car has a " + str(self.battery_size) + "-kwh battery.")class ElectricCar(Car):"""电动车的独特之处"""def __init__(self,make,model,year):"""电动汽车的独特之处初始化父类的属性,再初始化电动汽车特有的属性"""super().__init__(make,model,year)self.battery = Battery()

my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()

先是定了一个新类Battery,在方法_init_()处除self外,还有另一个形参battery_size。这个形参是可选的:如果没有给它提供任何值,电瓶容量将被设置为70。

在ElectricCar类中添加了一个名为self.battery的属性。让Python创建一个新的Battery实例(由于没有指定尺寸,因此为默认值70),并将该实例存储在属性self.battery中。每当方法_init_()被调用时,都执行该操作;因此现在每个ElectricCar实例都包含一个自动创建的Battery实例。

输出与我们前面看到的相同:

2016 Tesla Model S
This car has a 70-kwh battery.

下面再给Battery类添加一个方法,它根据电瓶容量报告汽车的续航里程:

class Car():--ship--class Battery():--ship--def get_range(self):"""打印一条消息,指出电瓶的续航里程"""if self.battery_size == 70:range = 240elif self.battery_size == 85:range = 270message = "This car can go approximately " +str(range)message += " miles on a full charge."print(message)class ElectricCar(Car):--ship--my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()

这个方法,也通过汽车的属性battery来调用它。输出指出了汽车的续航里程(这取决于电瓶的容量):

2016 Tesla Model S
This car has a 70-kwh battery.
This car can go approximately 240 miles on a full charge.

 9.4 导入类

 9.4.1 导入单个类

首先,创建一个只包含Car类的模块。由于在本章中,已经有一个名为car.py的文件,但这个模块也命名为car.py,因为它包含表示汽车的代码。我们将这样解决问题:将Car类存储在一个名为car.py的模块中,该模块将覆盖前面使用的文件car.py。从现在开始,使用该模块的程序都必须使用更加具体的文件名,如my_car.py。下面是模块car.py,其中只包含Car类的代码:

接着,创建另一个文件——my_car.py,在其中导入Car类并创建实例。

from car import Car

9.4.2 在一个模块中存储多个类

虽然同一个模块中的类之间应存在某种相关性,但可根据需要在一个模块中存储任意数量的类。

9.4.3 从一个模块中导入多个类

from car import Car,ElectricCar

9.4.4 导入整个模块

可以导入整个模块,再使用句点表示法访问需要的类

imprt car

my_beetle = car.Car('volkswagen','beetle,2016)

9.4.5 导入模块中的所有类

from module_name import*

不推荐使用这种导入方式,原因有二。首先,如果只要看一下文件开头的import语句,就能清楚地知道程序使用了哪些类。但是这种导入方式没有明确地指出你使用了模块中的哪些类。这种方式还可能引发名称方面的困惑。如果一不小心导入了一个与程序文件中其他同名的类,将引发难以诊断的错误。

9.4.6 在一个模块中导入另一个模块

如果一个模块中的类依赖于另一个模块中的类,可在前一个模块中导入必要的类。

例如,将Car类存储在一个模块中,并将ElectricCar和Battery类存储在另一个模块中。我们将第二个模块命名为electric_car.py。

electric_car.py

“““一组可用于表示电动汽车的类”””from car import Carclass Battery():--ship--class ElectricCar(car):--ship--

这一章的知识似乎很多,动手试一试,笔者没有每个都做,下面举个栗子吧。

p160 9-14 骰子

from random import randintclass Die():def __init__(self,sides = 6):self.sides = sidesdef roll_die(self):result=randint(1,self.sides)return resulttouzi = Die()
results = []
print("6面的骰子,掷10次:")
for time in range(10):results.append(touzi.roll_die())
print(results)results = []
middle_touzi =Die(10)
print("\n10面的骰子,掷10次:")
for time in range(10):results.append(middle_touzi.roll_die())
print(results)results = []
big_touzi = Die(20)
print("\n20面的骰子,掷10次:")
for time in range(10):results.append(big_touzi.roll_die())
print(results)

输出的结果:

6面的骰子,掷10次:
[2, 5, 1, 3, 4, 2, 6, 5, 6, 1]10面的骰子,掷10次:
[9, 1, 8, 4, 3, 7, 1, 6, 9, 5]20面的骰子,掷10次:
[4, 13, 9, 17, 13, 3, 13, 8, 1, 11]

用了列表的形式进行展示,是为了输出结果的美观。

9.6 类编码风格

类名采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。

对于每个类,都应该紧跟类定义后面包含一个文档字符串。

可用空行来组织代码,但不能滥用。在类中,可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。

需要同时导入标准库中的模块和你编写的模块时,先编写导入标准模块的import语句,再添加一个空行,然后编写导入你自己编写的模块的import语句。

转载于:https://www.cnblogs.com/cathycheng/p/11202991.html

《Python编程从入门到实践》学习笔记8(第9章:类)相关推荐

  1. python基础学习[python编程从入门到实践读书笔记(连载一)]

    写在前面:本文来自笔者关于<python编程从入门到实践>的读书笔记与动手实践记录. 程序员之禅 文章目录 02变量和简单数据类型 03 列表简介 04 操作列表 05 if语句 06 字 ...

  2. python基础学习[python编程从入门到实践读书笔记(连载三)]:django学习笔记web项目

    文章目录 Django项目:学习笔记web网页 项目部署 参考 自己部署的网站,还是小有成就感的,毕竟踩过很多坑,实战技能也有些许进步. 网站链接:http://lishizheng.herokuap ...

  3. python基础学习[python编程从入门到实践读书笔记(连载五)]:数据可视化项目第16章

    文章目录 下载数据 制作全球地震散点图:JSON格式 end 几个实验结果: 每日最高气温: 地震图绘制: 下载数据 CSV文件格式 在文本文件中存储数据,一个简单方式是将数据作为一系列以逗号分隔的值 ...

  4. 《Python编程从入门到实践》记录之第7章 用户输入(input)和while 循环总结(思维导图)

    有关input函数可参考博文<Python编程从入门到实践>记录之input()函数的详细介绍. 有关while循环可参考博文<Python编程从入门到实践>记录之while循 ...

  5. 《Python编程从入门到实践》记录之第2章 变量和简单数据类型总结(思维导图)

    <Python编程从入门到实践>第2章变量和简单数据类型知识总结:

  6. python编程从入门到实践读书笔记-《Python编程:从入门到实践》项目部分读书笔记(二)...

    鸽了一个暑假没有更新,现在趁着还没开学更一下.咕咕咕 上期作业: 请创建一个Django项目,命名为Blog,建不建立虚拟环境随便你,最后本地跑成了就行. 步骤: ①在需要创建工程的文件夹下打开cmd ...

  7. python编程:从入门到实践 阅读笔记

    文章目录 第一章 起步 第二章 变量和简单数据类型 String 数字 整数 浮点数 第三章 列表简介 第四章 操作列表 元组 第五章 if 语句 第六章 字典 第七章 用户输入和while循环 第八 ...

  8. python基础学习[python编程从入门到实践读书笔记(连载二)]:外星人入侵项目

    第一版游戏demo 添加计分系统:中间是最高得分,右边是本次得分. 显示余下的飞船数 主函数如下,完整程序将上传到笔者的github:https://github.com/shizhengLi/lea ...

  9. python基础学习[python编程从入门到实践读书笔记(连载六)]:数据可视化项目第17章

    文章目录 使用API end 项目结果: 使用plotly可视化github最受欢迎的python仓库: 修改后的可视化图表: 使用API 编写独立的程序,实现对获取的数据可视化.我们使用Web AP ...

  10. python基础学习[python编程从入门到实践读书笔记(连载四)]:数据可视化项目第15章

    文章目录 matplotlib初学 基础绘图用法 随机漫步 使用Plotly模拟掷骰子 matplotlib初学 基础绘图用法 import matplotlib.pyplot as pltsquar ...

最新文章

  1. python file does not exist_python – os.path.exists()的谎言
  2. css布局,让侧边栏高度撑满,并且不会随着屏幕内容滚动
  3. springmvc数据验证
  4. 基于RBAC的权限设计模型
  5. form表单中根据值判断是否disabled_Java 0基础入门 (Html表单、表单元素)
  6. vss团队开发工具使用(个人学习心得)
  7. rabbitmq的下载与安装windows-64
  8. java声明代码是什么_java安全编码指南之:声明和初始化说明
  9. ViewData 和 echarts用法
  10. HDU 6444 Neko's loop(单调队列)
  11. device 查看tensor_【ML实践笔记】05-DeepLizard教程8-9:在PyTorch中创建tensor
  12. LINUX剪贴板调用接口获取数据
  13. nginx 反向代理及负载均衡
  14. IE8-阿里icon字体引用不显示的问题
  15. Elasticsearch:运用 Elasticsearch 查找类似文档:more_like_this
  16. SpringAop_2通知(新手)和无法找到元素 'aop:aspectj-autoproxy' 的声明
  17. matlab计算一组数的函数值_2.Matlab数值数组及其运算
  18. java md5加密 jar包_BeanShell调用自己写的jar包进行MD5加密
  19. VSCode的LeetCode插件中国区账号密码登录错误
  20. php爬取flash的交互数据库,flash用php连接数据库的代码

热门文章

  1. 开源项目管理工具禅道ZenTaoPMS发布0.6 beta版本
  2. 不迈出第一步,不去尝试,你永远不知道能否成功
  3. (4)pyspark---dataframe清理
  4. P3119 [USACO15JAN]草鉴定Grass Cownoisseur
  5. MUI 支付宝支付接入
  6. SqlServer 左右内连接
  7. gbk utf-8 string java
  8. 【自然框架之SSO】实现SSO的一个初步想法
  9. 存储过程实现无限级分类(3)
  10. DataSet.Relations 属性