版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
要导入模块中的每个类,可使用下面的语法:
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 语法来访问类(前文讲过,这个是重点)。这样做时,虽然文件开头并没有列出用到的所有类,但你清楚地知道在程序的哪些地方使用了导入的模块;你还避免了导入模块中的每个类可能引发的名称冲突。