S01E10 类(下)
- 引言
- 导入单个类
- 导入一个模块中的多个类
- 从一个模块中导入多个类
- 导入整个模块
- 更多引入格式建议
- 不建议的引入格式
- 创建别名
- 类的“大驼峰”式命名法
引言
本博文主要内容将围绕 Python 如何将类存储在模块中,然后在主程序中导入所需的模块,在主程序中调用模块中的类从而构建实例。
有关类的基本概念与引入,请看博文:【Python基础】S01E08 类(上)
有关类的继承,父类与子类,请看博文:【Python基础】S01E09 类(中)
导入单个类
在本部分我们将构建两个 .py 文件,一个为存储类的模块 car.py
;另一个为主函数 my_car.py
。
car.py
class Car():def __init__(self, make, model, year):self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):long_name = f"{self.year} {self.make} {self.model}"return long_namedef read_odometer(self):print(f"This car has {self.odometer_reading} miles on it.")def update_odometer(self, mileage):if mileage >= self.odometer_reading:self.odometer_reading = mileageelse:print("You can't roll back an odometer.")def increment_odometer(self, miles):self.odometer_reading += miles
my_car.py
from car import Carmy_new_car = Car('Audi', 'a4', 2024)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
在 my_car.py
中,我们使用 import 语句让 Python 打开模块 car(car.py)并导入其中的 Car 类。这样,我们就可以使用 Car 类。
导入类是一种高效的编程方式。如果一个程序既包含类的构造部分,又包含使用类的部分,代码会非常长。我们通过将类的构造部分移动到一个模块中并导入该模块,依然可以使用属性与行为。
导入一个模块中的多个类
在本部分我们构建两个函数,一个为存储多个类的模块 car.py
,另一个为主函数 my_car.py
。
class Car:def __init__(self, make, model, year):self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):long_name = f"{self.year} {self.make} {self.model}"return long_namedef read_odometer(self):print(f"This car has {self.odometer_reading} miles on it.")def update_odometer(self, mileage):if mileage >= self.odometer_reading:self.odometer_reading = mileageelse:print("You can't roll back an odometer.")def increment_odometer(self, miles):self.odometer_reading += milesclass Battery:def __init__(self, battery_size=40):self.battery_size = battery_sizedef describe_battery(self):print(f"This car has a {self.battery_size}-KWh battery.")def get_range(self):if self.battery_size == 40:range = 150elif self.battery_size == 65:range = 225print(f"This car can go about {range} miles on a full charge.")class ElectricCar(Car):def __init__(self, make, model, year):super().__init__(make, model, year)self.battery = Battery()
my_car.py
from car import ElectricCarmu_leaf = ElectricCar('nissian','leaf',2024)
print(mu_leaf.get_descriptive_name())
mu_leaf.battery.describe_battery()
mu_leaf.battery.get_range()>>> 2024 nissian leaf
This car has a 40-KWh battery.
This car can go about 150 miles on a full charge.
上述案例我们通过类 ElectricCar 创建了一个实例 nissian。
从一个模块中导入多个类
这次,我们将从一个包含多个类的模块中使用多个类。
我们希望创建两个车的实例,一个是电动车,一个是汽车。
car.py
代码同上;
my_car.py
from car import Car, ElectricCarmy_mustang = Car('Ford','mustang', 2024)
print(my_mustang.get_descriptive_name())
my_volvo = ElectricCar('Volvo','Ex90',2024)
print(my_volvo.get_descriptive_name())>>> 2024 Ford mustang
2024 Volvo Ex90
上述的代码中,我们从一个模块中导入多个类,用逗号分隔开类名。当导入后,我们根据需要,创建了燃油汽车类(Car
)实例(Ford mustang
)和电动汽车类(ElectricCar
)实例(Volvo Ex90
)。
导入整个模块
此外,我们还可以通过导入整个模块的方法。当我们将整个模块(car)导入后,使用点号访问需要的类。而在导入很多模块时,又因为创建类的实例的代码都包含模块名,所以不会因为类的名冲突而影响整个程序。
导入整个模块法
import carmy_mustang = car.Car('Ford','mustang', 2024)
my_volvo = car.ElectricCar('Volvo','Ex90',2024)
同:从一个模块中导入多个类
from car import Car, ElectricCarmy_mustang = Car('Ford','mustang', 2024)
my_volvo = ElectricCar('Volvo','Ex90',2024)
导入整个模块法,我们首先导入整个 car 模块。然后使用语法 module_name.classname
访问需要的类。
更多引入格式建议
不建议的引入格式
不推荐的导入方式;
from module_name import *
使用上述引入格式虽然可以引入类,但是读者应该在引入时清楚程序用了哪些类。其次,这样引入,如果需要引入很多类,类名相同会导致引发问题。
创建别名
当我们要引入的类非常繁琐,或者极长时,哦我们应该使用别名缩短长度;
e . g . e.g. e.g.
from electric_car import ElectricCar as EC
my_volvo = EC('Volvo','Ex90',2024)
类的“大驼峰”式命名法
- 类名应采用大驼峰式命名法,即将类名中的每个单词的首字母都大写,并且不适用下划线。
- 实例名和模块名应采用全部小写格式,并在单词之间加上下划线。
- 而对于每个类,都应该在类定义后面紧跟一个文档字符串。文档字符串将简要的描述类的功能。
- 我们还可以使用空行来组织代码,但是不宜过多。在类中,可以使用一个空行来分隔方法;而在模块中,可以使用两个空行来分隔类。
- 当需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的
import
语句,再添加一个空行,然后编写导入你自己编写的模块的import
语句。在包含多条import
语句的程序中,这种做法更容易明白程序使用的各个模块来自于哪里。
徐鸿铎
2023.9.27
海淀 北京 中国