【Python】学习笔记之类|第8篇
书籍:《Python编程:从入门到实践》
打卡人:Owenli
打卡时间:2018.4.17
Python从入门到实践目录
- Python学习笔记之基本数据类型|第1篇
- Python学习笔记之列表|第2篇
- Python学习笔记之条件控制|第3篇
- Python学习笔记之字典|第4篇
- Python学习笔记之用户输入和While循环|第5篇
- Python学习笔记之函数|第6篇
- Python学习笔记之函数(续)|第7篇
- Python学习笔记之类|第8篇
- Python学习笔记之类(续)|第9篇
- Python学习笔记之文件和异常(上)|第10篇
- Python学习笔记之文件和异常(下)|第11篇
前言
面向对象编程 是最有效的软件编写方法之一。在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。编写类时,你定义一大类对 象都有的通用行为。基于类创建对象 时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。使用面向对象编程可模拟现实情景,其逼真 程度达到了令你惊讶的地步。
根据类来创建对象被称为实例化 ,这让你能够使用类的实例。在本章中,你将编写一些类并创建其实例。你将指定可在实例中存储什么信息,定义可对这些实例执行 哪些操作。你还将编写一些类来扩展既有类的功能,让相似的类能够高效地共享代码。你将把自己编写的类存储在模块中,并在自己的程序文件中导入其他程序员编 写的类。
一、创建和编写类
以Dog
类为例,创建一个包含名字和年龄,具有蹲下和打滚能力的类。
类中的函数称为方法,前面学习有关函数的内容在这里都适用。感到困惑的方法,应该就是 __init__()
方法。它是一个特殊方法,每当创建实例时都会自动运行它。
我们将方法__init__()
定义成了包含三个形参:self
、name
和age
。在这个方法的定义中,形参self
必不可少,还必须位于其他形参的前面。为何必须在方法定义中包 含形参self
呢? 因为Python调用这个__init__()
方法来创建Dog
实例时,将自动传入实参self
。每个与类相关联的方法调用都自动传递实参self
,它是一个指向实例本身 的引用,让实例能够访问类中的属性和方法。我们创建Dog 实例时,Python
将调用Dog
类的方法__init__()
。我们将通过实参向Dog()
传递名字和年龄;self
会自动传递,
因此我们不需要传递它。每当我们根据Dog
类创建实例时,都只需给最后两个形参(name 和age )提供值。
1.1 根据类创建实例
上面定义了Dog
类,下面看看如何创建Dog
实例。
创建实例my_dog
。在打印实例信息时,通过使用.
语法来访问属性名。
访问方法,也是通过.
语法。
my_dog.sit()
my_dog.roll_over()
类创建实例的个数是不受限制的,可按需求根据类创建任意数量的实例。每个实例之间会不影响,存在不同的内存地址中。
二、使用类和实例
修改类属性的方法,可以直接修改实例属性,也可以编写方法以特定的方式进行修改。
下面定义一个Car
类。
2.1 给属性指定默认值
类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。设置初始值,可以在__init__()
内指定这种初始值,这样就不用设置形参了。
还是上面的Car
类,添加一个odometer_reading
属性,并设置默认值为0。
添加了一个read_odometer()
方法用来打印里程信息。
2.2. 修改属性值
汽车里程是随着使用,逐渐递增的。如何修改属性值呢?
- 直接修改属性值
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
# 输出结果: This is has 23 miles on it.
- 通过方法修改属性值
class Car():
# ....
def update_odometer(self, mileage):
"""将里程数设为指定值,递增"""
self.odometer_reading += mileage
my_new_car.update_odometer(34)
my_new_car.read_odometer()
# 输出结果: This is has 34 miles on it.
通过使用update_odometer()
方法来更新属性的值。
三、继承
编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承 。一个类继承 另一个类时,它将自动获得另一个类的所有属性和方法;原有的 类称为父类 ,而新类称为子类 。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
3.1 子类的方法__init__()
创建子类的实例时,Python
首先需要完成的任务是给父类的所有属性赋值。因此, 需要在初始化方法调用父类的初始化方法。
在上面我们定义了Car
类,通过继承定义一个ElectricCar
电动车类。
上面定义了ElectricCar
类继承自Car
。子类拥有父类所有的属性和方法。
在子类的初始化方法中super()
是一个特殊函数,帮助Python
将父类和子类关联起来。
3.2 给子类定义属性和方法
让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法。
根据ElectricCar
创建的实例都会有这个属性,而Car
的实例没有。
3.3 重写父类方法
对于父类的方法,只要它不符合子类模拟的实际行为,都可对其进行重写。
def get_descriptive_name(self):
"""打印名称"""
long_name = str(self.year) + ' ' + self.make + ' ' + self.model + ' ' + self.battery_size
return long_name.title()
重写父类get_descriptive_name()
多打印battery_size
信息。
3.4 实例做属性
使用代码模拟实物,随着细节的增加需要代码越来越多。这种情况下可以将类中一部分提取出来,组合成多各类协作的方式。
添加Battery
类,负责电池管理。它的实例是ElectricCar
类的一个属性。
四、小结
本篇学习Python
中类的概念,如何创建类、属性、方法以及类继承等相关知识。由于篇幅问题,下篇继续学习类剩下的内容。