PYTHON类(4)导入类

随着不断给类添加功能,文件可能变得很长,即便妥善地使用了继承亦如 此。为遵循Python的总体理念,应让文件尽可能整洁。Python在这方面提 供了帮助,允许将类存储在模块中,然后在主程序中导入所需的模块。

1、导入单个类

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

car.py

"""一个可用于表示汽车的类"""

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

上面包含一个模块级文档字符串,对该模块的内容做了简要的描述。你应为 自己创建的每个模块编写文档字符串。 下面来创建另一个文件my_car.py,在其中导入Car类并创建其实例:

my_car.py

from car import Car

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()

import语句让Python打开模块car并导入其中的Car类。这样,我 们就可以使用Car类,就像它是在这个文件中定义的一样。输出与我们在前 面看到的一样:

2016 Audi A4
This car has 23 miles on it.

2、在一个模块中存储多个类

虽然同一个模块中的类之间应存在某种相关性,但可根据需要在一个模块 中存储任意数量的类。Battery类和ElectricCar类都可帮助模拟汽车, 下面将它们都加入模块car.py中:

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

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

    def get_range(self):
        """打印一条消息,指出电瓶的续航里程"""
        if self.battery_size==70:
            range=240
        elif self.battery_size==85:
            range=270

        message="This car can go approximately "+str(range)
        message+=" miles on a full charge."
        print(message)

class ElectricCar(Car):
    """电动汽车的独特之处"""

    def __init__(self, make, model, year):
        """初始化父类的属性,再初始化电动汽车特有属性"""
        super().__init__(make,model,year)
  
        self.battery=Battery()


现在,可以新建一个名为my_electric_car.py的文件,导入ElectricCar 类,并创建一辆电动汽车了:

my_electric_car.py

from car import ElectricCar

my_tesla=ElectricCar('tesla','model s',2016)

print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()

输出与我们在前面看到的相同,但大部分逻辑隐藏在一个模块中:

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

3、从一个模块中导入多个类

可根据需要在程序文件中导入任意数量的类。如果要在同一个程序中创建 普通汽车和电动汽车,就需要将Car类和ElectricCar类都导入:

my_cars.py

from car import Car,ElectricCar

my_beetle=Car('volkswagen','beetle','2016')
print(my_beetle.get_descriptive_name())

my_tesla=ElectricCar('tesla','roadster','2016')
print(my_tesla.get_descriptive_name())

从一个模块中导入多个类时,用逗号分隔了各个类。导入必要的类 后,就可根据需要创建每个类的任意数量实例。

2016 Volkswagen Beetle
2016 Tesla Roadster

4、导入整个模块

还可以导入整个模块,再使用句点表示法访问需要的类。这种导入方式很 简单,代码也易于阅读。因为创建类实例的代码都包含模块名,所以不会 与当前文件使用的任何名称发生冲突。

import car

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

my_tesla=car.ElectricCar('tesla','roadster','2016')
print(my_tesla.get_descriptive_name())

5、导入模块中的所有类

要导入模块中的每个类,可使用下面的语法:

from module_name import *

不推荐使用这种导入方式,原因有二。第一,如果只看文件开头的import 语句,就能清楚地知道程序使用了哪些类,将大有裨益。然而这种导入方 式没有明确地指出使用了模块中的哪些类。第二,这种方式还可能引发名 称方面的迷惑。如果不小心导入了一个与程序文件中其他东西同名的类, 将引发难以诊断的错误。这里之所以介绍这种导入方式,是因为虽然不推 荐使用,但你可能在别人编写的代码中见到它。 需要从一个模块中导入很多类时,最好导入整个模块,并使用 module_name.ClassName语法来访问类。这样做时,虽然文件开头并没 有列出用到的所有类,但你清楚地知道在程序的哪些地方使用了导入的模 块。这也避免了导入模块中的每个类可能引发的名称冲突。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值