python基础知识:导入模块中的所有类(结合注释来理解常见操作)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/YJG7D314/article/details/102765328

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

from module_name import  *

这个代码你应该见过。结合前面的代码来理解语法哈:

from Car import  Car,ElectricCar#import 语句让Python打开模块Car,并从Car模块中导入和类Car类ElectricCar.这注释务必记住

以下是模块Car,也可以说是Car.py里的源代码

class Car:
    def __init__(self, make, model, year):  # 定义一个特别的初始化方法。无需实例的调用就可运行。减少重复代码的使用量
        # 初始化描述汽车的属性
        self.make = make  # 新建属性。self.属性名 = 属性值。语法借鉴赋值语句。
        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):
        """将里程表里的读数设置为指定的值"""
        self.odometer_reading = mileage  # 通过方法来修改属性值

    def increment_odometer(self, miles):
        """将里程表里的读数增加指定的量"""
        self.odometer_reading += miles  # 通过方法对属性的值进行递增

class Battery():
    """一次模拟电动汽车电瓶的简单尝试"""
    def __init__(self,battery_size = 60):
        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 = 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_new_car = Car('audi', 'a4', 2016)  # 根据Car类创建的一个实例
print(my_new_car.get_descriptive_name())  # 通过实例来调用方法
# 替换一下:print(str(self.year) + " " + self.make + " " + self.model)会报错,在类外面调用初始化方法里的属性必须将self换成实例名
my_new_car.odometer_reading = 23  # 直接修改属性值
my_new_car.update_odometer(26)  # 通过方法来修改属性值
my_new_car.read_odometer()  # 通过实例来调用方法

不难发现,模块Car里有三个类,分别是:Car,Battery,ElectricCar。
即模块Car里所有的类分别是:Car,Battery,ElectricCar。
那么

from Car import  *

等价于

from Car import  Car,Battery,ElectricCar

在这里,*就表示Car模块的所有的类分别是:Car,Battery,ElectricCar。

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

猜你喜欢

转载自blog.csdn.net/YJG7D314/article/details/102765328