带你自学Python系列(十七):Python中类的用法(三)

↑ 点击上方【计算机视觉联盟】关注我们

今天是小编持续更新关于Python的知识总结以及Python实践项目应用的第17天,带你利用零碎时间自学最受欢迎的编程语言之一Python语言。你和小编一起打卡了吗?


一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类(超类),新类称为子类。

1、子类定义和创建

下边结合例子详细叙述类的继承,下边例子是一个简单的ElectricCar类,它具备了Car类的所有功能:

 1#!/usr/bin/env python
 2# -*- coding:utf-8 -*-
 3
 4
 5# 父类
 6class Car():
 7    """一次模拟汽车的简单尝试"""
 8
 9    def __init__(self, make, model, year):
10        """初始化描述汽车的属性"""
11        self.make = make
12        self.model = model
13        self.year = year
14        self.odometer_reading = 0  # 指定默认值
15
16    def get_descriptive_name(self):
17        """返回整洁的描述性信息"""
18        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
19        return long_name.title()
20
21    def read_odometer(self):
22        """打印一条指出汽车里程的消息"""
23        print("This car has " + str(self.odometer_reading) + " miles on it.")
24
25    def update_odometer(self, mileage):
26        """将历程表读数设置为指定的值"""
27        if mileage >= self.odometer_reading:
28            self.odometer_reading = mileage
29        else:
30            print("You can't roll back an odometer")
31
32    def increment_odometer(self, miles):
33        """将里程表读数增加指定的量"""
34        self.odometer_reading += miles
35
36
37# 子类,括号里必须包含父类名称
38class ElectricCar(Car):
39    """电动汽车的独特之处"""
40
41    # 接受创建Car实例所需的信息
42    def __init__(self, make, model, year):
43        """初始化父类的属性"""
44        # super()特殊的函数,关联父类和子类
45        super().__init__(make, model, year)  # 初始化父类的属性
46        self.battery_size = 70  # 初始化电动车特有的属性
47
48    def describe_battery(self):
49        """打印一条描述电瓶容量的信息"""
50        print("This car has a " + str(self.battery_size) + "-kwh battery.")
51
52
53my_tesla = ElectricCar('tesla', 'model S', 2016)  # 创建一个my_tesla实例
54print(my_tesla.get_descriptive_name())  # 打印车辆信息
55my_tesla.describe_battery()  # 调用电瓶方法

运行结果为:

由上边代码为例子来详细叙述创建子类的方法:

  • 创建子类时,必须包含父类且必须位于子类前面

  • 定义子类时,括号里必须包含父类的名称

  • 在_init_方法内,必须初始化父类所需要的信息,使用super().__init__()方法初始化父类属性

  • 子类特有的属性只包含在子类的实例中,父类的实例并不包含。

2、重写父类的方法

可以对父类中的方法进行重写,方法是在子类中定义与父类同样名字的方法,这样,Python将不会考虑这个父类方法,而只关注子类中定义的相应方法。

假设上述例子中Car类有一个名为fill_gas_tank()的方法,对于电动汽车来说毫无意义,因此可以重写它,代码类似如下:

1class ElectricCar(Car):
2    --snip--
3
4    def fill_gas_tank(self):
5        """电动汽车没有邮箱"""
6        print("This car doesn't need a gas tank!")

3、将实例用作属性

将一个类的实例用作一个类的属性。如还是上述例子,电动汽车有很多关于电瓶的属性和方法,为了使得程序更直观整洁,将关于电瓶的属性和方法放到一个名为Battery的类中,并将一个Battery实例用作ElectricCar类的一个属性,代码类似如下:

 1#!/usr/bin/env python
 2# -*- coding:utf-8 -*-
 3
 4
 5# 父类
 6class Car():
 7    """一次模拟汽车的简单尝试"""
 8
 9    def __init__(self, make, model, year):
10        """初始化描述汽车的属性"""
11        self.make = make
12        self.model = model
13        self.year = year
14        self.odometer_reading = 0  # 指定默认值
15
16    def get_descriptive_name(self):
17        """返回整洁的描述性信息"""
18        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
19        return long_name.title()
20
21    def read_odometer(self):
22        """打印一条指出汽车里程的消息"""
23        print("This car has " + str(self.odometer_reading) + " miles on it.")
24
25    def update_odometer(self, mileage):
26        """将历程表读数设置为指定的值"""
27        if mileage >= self.odometer_reading:
28            self.odometer_reading = mileage
29        else:
30            print("You can't roll back an odometer")
31
32    def increment_odometer(self, miles):
33        """将里程表读数增加指定的量"""
34        self.odometer_reading += miles
35
36
37class Battery():
38    """一次模拟电动汽车电瓶的简单尝试"""
39
40    def __init__(self, battery_size=70):
41        """初始化电瓶的属性"""
42        self.battery_size = battery_size
43
44    def describe_battery(self):
45        """打印一条描述电瓶容量的信息"""
46        print("This car has a " + str(self.battery_size) + "-kwh battery.")
47
48
49# 子类,括号里必须包含父类名称
50class ElectricCar(Car):
51    """电动汽车的独特之处"""
52
53    # 接受创建Car实例所需的信息
54    def __init__(self, make, model, year):
55        """初始化父类的属性"""
56        # super()特殊的函数,关联父类和子类
57        super().__init__(make, model, year)  # 初始化父类的属性
58        # Battery的一个实例作为ElectricCar的一个属性
59        self.battery = Battery(100)
60
61
62my_tesla = ElectricCar('tesla', 'model S', 2016)  # 创建一个my_tesla实例
63print(my_tesla.get_descriptive_name())  # 打印车辆信息
64my_tesla.battery.describe_battery()  # 调用电瓶方法

运行结果:

往期回顾

● 2018年12月精选文章目录一览

● 亲身经历2019年校招8个大厂心得体会,纯干货分享(大疆、百度...)

● 独家总结 | 一文读懂机器学习的“发展历程” (时间历程,详细又充实!)

● 人工智能相关领域的国际顶尖会议介绍

● 2018年度最强的30个机器学习项目!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值