《Python编程从入门到实践》记录之类存储在模块及其导入

目录

1、模块中存储多个类和导入多个类

2、导入整个莫模块

3、导入模块中的所有类


为了使得程序尽可能整洁易读,可以将类存储在模块中,然后在主程序中导入所需的模块。


1、模块中存储多个类和导入多个类

一般情况下,一个模块中的类之间应存在某种相关性,这里为了说明此情况,将多个类存储在一个模块中,实际应用中,最好还是将相关联的存储在一个模块中,不同模块中的类相对独立,这样有助于编写程序和管理程序。

下边例子还是汽车的例子,一个模块car.py中有两个类Car和ElectricCar,并建立一个my_cars.py的文件导入这两个类:

模块(car.py):

# car.py模块

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""一组用于表示燃油汽车和电动汽车的类"""


# 父类
class Car():
    """一次模拟汽车的简单尝试"""

    def __init__(self, make, model, year):
        """初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0  # 指定默认值

    def 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")

    def increment_odometer(self, miles):
        """将里程表读数增加指定的量"""
        self.odometer_reading += miles


class Battery():
    """一次模拟电动汽车电瓶的简单尝试"""

    def __init__(self, battery_size=70):
        """初始化电瓶的属性"""
        self.battery_size = battery_size

    def describe_battery(self):
        """打印一条描述电瓶容量的信息"""
        print("This car has a " + str(self.battery_size) + "-kwh battery.")


# 子类,括号里必须包含父类名称
class ElectricCar(Car):
    """电动汽车的独特之处"""

    # 接受创建Car实例所需的信息
    def __init__(self, make, model, year):
        """初始化父类的属性"""
        # super()特殊的函数,关联父类和子类
        super().__init__(make, model, year)  # 初始化父类的属性
        # Battery的一个实例作为ElectricCar的一个属性
        self.battery = Battery(100)  # 初始化电动汽车的特有属性

主程序(my_cars.py):

#!/usr/bin/env python
# -*- coding:utf-8 -*-


# 从car模块中导入Car和ElectricCar类
from car import Car, ElectricCar

# 一个燃油汽车的实例
my_car = Car('audi', 'a6l', '2018')
print(my_car.get_descriptive_name())

# 一个电动汽车的实例
my_electric_car = ElectricCar('tesla', 'model s', '2017')
print(my_electric_car.get_descriptive_name())

运行结果:


2、导入整个莫模块

上述例子是导入具体的类,我们也可以导入整个模块,使用句点表示法访问需要的类。

下边例子是导入上述car整个模块,使用句点表示法访问Car和ElectricCar类:

#!/usr/bin/env python
# -*- coding:utf-8 -*-


# 从car模块整个模块
import car

# 一个燃油汽车的实例
my_car = car.Car('audi', 'a6l', '2019')   # 句点法表示访问需要的类
print(my_car.get_descriptive_name())

# 一个电动汽车的实例
my_electric_car = car.ElectricCar('tesla', 'model s', '2016')   # 句点法表示访问需要的类
print(my_electric_car.get_descriptive_name())

运行结果:


3、导入模块中的所有类

导入模块中的所有类,类似于导入模块中的所有函数一样,使用的语法如下:

from module_name import*

这种方法简单,但不推荐使用这种方法,推荐使用上述1、2方法

虽然不提倡,还是说明怎么用了解一下,下边例子就是导入模块中的所有类:

#!/usr/bin/env python
# -*- coding:utf-8 -*-


# 从car模块导入所有类
from car import*

# 一个燃油汽车的实例
my_car = Car('audi', 'a6l', '2019')   # 可以直接使用类
print(my_car.get_descriptive_name())

# 一个电动汽车的实例
my_electric_car = ElectricCar('tesla', 'model s', '2016')   # 可以直接使用类
print(my_electric_car.get_descriptive_name())

运行结果:


4、在一个模块中导入另一个模块

将上述car模块分解为两个模块:Car类模块(car.py)、ElectricCar和Battery组成的模块(electric_car.py)。

car.py模块:

"""一个可用于表示汽车的类"""
class Car():
    ---snip---

electric_car.py模块:

"""一组可用于表示电动汽车的类"""

# 导入car模块中的Car类,从一个模块导入另一个模块
from car import Car

class Battery():
    ---snip---

class ElectricCar(Car):
    ---snip---

主程序(my_cars.py):

from car import Car
from electric_car import ElectricCar

# 一个燃油汽车的实例
my_car = Car('audi', 'a6l', '2019')   # 可以直接使用类
print(my_car.get_descriptive_name())

# 一个电动汽车的实例
my_electric_car = ElectricCar('tesla', 'model s', '2016')   # 可以直接使用类
print(my_electric_car.get_descriptive_name())

运行结果:

猜你喜欢

转载自blog.csdn.net/Sophia_11/article/details/84560269