继承
如果要编写的类是另一个现成类的特殊版本,可以使用继承。一个类继承另一个类,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新的类称为子类。
子类的方法__init__
class Car():
"""一次模拟汽车的简单尝试"""
def _init_(self,make,model,year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer = odometer
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 ElectricCar(Car):
""" 电动汽车的独特之处"""
def __init__(self,make,model,year):
""" 初始化父类的属性"""
super().__init__(make,model s,year)
my_tesla = ElectricCar('tesla','models',2016)
print(my_tesla.get_descriptive_name())
给子类定义属性和方法
让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法
class Car():
---snip---
class ElectricCar(Car):
""" 电动汽车的独特之处"""
def __init__(self,make,model,year):
"""电动汽车的独特之处,初始化父类的属性,再初始化电动汽车特有的属性"""
super().__init__(make,model,year)
self.battery_size = 70
def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a "+str(self.battery_size)+"-KWh battery.")
my_tesla = ElectricCar('tesla','models',2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_baterry()
重写父类的方法
可在子类中定义一个这样的方法,即它与重写的父类方法同名。这样,Python建构会考虑这个父类方法,而只关注你在子类中定义的相应方法。
class ElectricCar(Car)"
---sinp---
def fill_gas_tank(self):
"""电动汽车没有油箱"""
print("This car doesn't need a gas tank!")
将实例用作属性
属性和方法清单以及文件都越来越长,在这种情况下可能需要将类的一部分作为一个独立的类提取出来。你可以将大类型拆分成多个协同工作的小类。
class Car():
----sinp----
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):
""" 电动汽车的独特之处"""
def __init__(self,make,model,year):
"""电动汽车的独特之处,初始化父类的属性,再初始化电动汽车特有的属性"""
super().__init__(make,model,year)
self.battery = Battery()
my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
再添加电瓶容量报告
class Car():
----sinp----
class Battery():
---sinp---
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):
----sinp----
my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
模拟实物
如果我们只需要描述一辆汽车,那么将方法get_range()放在Battery类中也许是合适的;但是如果要描述一家汽车制造商的整个产品线,也许应该将方法get_range()移到ElectricCar类中。在这种情况下,get_range()依然根据电瓶容量来确定续航里程,但报告的是一款汽车的续航里程。我们可以这样做:将方法fget_range()还保留在Battery类中,但向它传递一个参数,如car_model;在这种情况下,方法get_range()将根据电瓶容量和汽车型号报告续航里程。
导入类
将类存储在模块中,然后在主程序中导入所需的模块
导入单个类
将Car类存储在一个名为car.py的模块中,该模块将覆盖前面使用的文件car.py。从现在开始,使用该模块的程序都必须使用更具体的文件名,如my_car.py。
car.py
"""一个可表示汽车的类"""
class Car():
"""一次模拟汽车的简单尝试"""
def _init_(self,make,model,year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer = odometer
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类并创建其实例)
form car import Car
my_new_car = Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_nwe_car.read_odmeter()
在一个模块中存储多个类
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.get.range()
从一个模块中导入多个类
my_cars.py
form 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_gescriptive_name())
导入整个模块
my_cars.py
import car
my_beetle =car('volkswagen','beetle',2016)
print(my_beetle.get_descriptive_name())
my_tesla =car.ElectricCar('tesla','roadster',2016)
print(my_tesla.get_gescriptive_name())
导入模块中的所有类
from module_name import *
不推荐此导入方式
需要从一个模块中导入很多类时,最好导入整个模块,并使用module_name.class_name语法来访问。
在一个模块中导入另一个模块
electric_car.py
"""一组可用于表示电动汽车的类"""
from car import Car
class Battery():
-----snip----
class ElectricCar(Car):
----snip----
car.py
"""一个可用于表示汽车的类"""
class Car():
----snip----
现在可以分别从每一个模块中导入类,以根据需要创建任何类型的汽车了
my_cars.py
from car import Car
from electric_car import ElectricCar
my_beetle =Car('colkswagen','beetle',2016)
print(my_beetle.get_descriptive_name())
my_tesla =ElectricCar('tesla','roadster',2016)
print(my_tesla.get_descriptive_name())