这一章主要是关于类的继承,一个类继承另一类的时候,它将自动获取另一个类的所有属性和方法,原有的类为父类。现有的类为子类,子类继承父类的所有的属性和方法,还可以自我定义新属性和方法。
子类的方法__init__:创建子类时,父类必须包含其中,父类是Car,定义一个ElectricCar子类
class Car():
def __init__(self,make,model,year): #初始化
self.make=make
self.model=model
self.year=year
self.odometer_reading=0 # 定义里程表的默认值
def get_describe(self): #定义描述整体信息的方法
long_name=str(self.year)+' '+self.make+self.model
return long_name.title()
def update_odometer(self,milege): #定义更新属性值方法
if milege>=self.odometer_reading:
self.odometer_reading=milege
else: #确定数值不会回调
print("wrong data!")
def increment_odometer(self,miles): #定义递增方法
self.odometer_reading+=miles
def read_odometer(self): #打印里程数
print("This car has "+str(self.odometer_reading)+" miles")
class ElectricCar(Car): #创建子类
def __init__(self,make,model,year):
super().__init__(make,model,year) #super函数关联父类和子类
my_tesla=ElectricCar('tesla',',model s',2018)
print(my_tesla.get_describe())
1.创建子类的时候,在括号里指定父类的名称,__init__接受Car 实例所要的信息
2.super是一个特殊函数,让父类与子类关联起来,让子类调用父类的方法__init__,获取父类的所有属性。
输出如下:
上面只是简单继承父类,子类没有自己创建属性与方法,子类也可以创建自己的属性:
class Car():
def __init__(self,make,model,year): #初始化
self.make=make
self.model=model
self.year=year
self.odometer_reading=0 # 定义里程表的默认值
def get_describe(self): #定义描述整体信息的方法
long_name=str(self.year)+' '+self.make+self.model
return long_name.title()
def update_odometer(self,milege): #定义更新属性值方法
if milege>=self.odometer_reading:
self.odometer_reading=milege
else: #确定数值不会回调
print("wrong data!")
def increment_odometer(self,miles): #定义递增方法
self.odometer_reading+=miles
def read_odometer(self): #打印里程数
print("This car has "+str(self.odometer_reading)+" miles")
class ElectricCar(Car): #创建子类
def __init__(self,make,model,year):
super().__init__(make,model,year) #super函数关联父类和子类
self.battery_size=70 #定义子类的新属性电池量,默认值70
def battery_describe(self): #打印电池量
print("This car has a "+str(self.battery_size)+"-kwh")
my_tesla=ElectricCar('tesla',',model s',2018)
print(my_tesla.get_describe())
my_tesla.battery_describe()
在子类方法__init__里创建子类属性。
输出如下:
但是也有以下情况,有时候父类的某些属性,子类不符合,这时候就可以重写父类的方法,我们可以在子类中先定义一个方法,这个方法要与需要重写的父类方法同名,这样Python就只会考虑子类里的方法。
为了追求Python的代码简洁,我们经常会将实例用作属性。因为如果一个类的细节很多很多,就可以将类的一部分提取出来创建新类,例如如下,将Battery 用作小类:
class Car():
def __init__(self,make,model,year): #初始化
self.make=make
self.model=model
self.year=year
self.odometer_reading=0 # 定义里程表的默认值
def get_describe(self): #定义描述整体信息的方法
long_name=str(self.year)+' '+self.make+self.model
return long_name.title()
def update_odometer(self,milege): #定义更新属性值方法
if milege>=self.odometer_reading:
self.odometer_reading=milege
else: #确定数值不会回调
print("wrong data!")
def increment_odometer(self,miles): #定义递增方法
self.odometer_reading+=miles
def read_odometer(self): #打印里程数
print("This car has "+str(self.odometer_reading)+" miles")
class Battery(): #定义电池类
def __init__(self,battery_size=70):
self.battery_size=battery_size
def battery_describe(self): #打印电池量
print("This car has a "+str(self.battery_size)+"-kwh")
class ElectricCar(Car): #创建子类
def __init__(self,make,model,year):
super().__init__(make,model,year) #super函数关联父类和子类
self.battery=Battery() #创建的新属性
my_tesla=ElectricCar('tesla',',model s',2018)
print(my_tesla.get_describe())
my_tesla.battery.battery_describe()
输出如下:
类除了继承,还可以封装,也就是跟函数一样可以导入模块
先创建一个文件,保存你所写的类,建议每个模块类写上备注,这样比较清晰,
再创建一个文件,编写你想要的程序,导入类,
from 模块名 import 类名
从一个模块导入多个类:
from 模块名 import 类1,类2
导入整个模块:
from 模块名
导入模块中的所有类;
from 模块名 import *