一、基础实例代码
class Car():
def __init__(self, make, model, year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 #如果对属性设置默认值,那么括号里面就不需要给
#odometer_reading这个形参了
def get_descriptive_name(self):
long_name = str(self.year)+ " " + self.make + " " +self.model
return long_name.title()
def read_odometer(self):
print(str(self.get_descriptive_name()) + " has " + str(self.odometer_reading) + " miles on it")
#实例化
my_new_car = Car('audi', 'a6', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
""" 笔记
1、以self为前缀的变量可以供类中的所有方法使用
2、在类中的一个函数中调用另一个函数,需要在前面加上self.
例如本例的self.get_descriptive_name()
"""
输出结果:
二、类的继承
子类继承了父类的所有属性和方法,同时还可以定义自己的属性和方法
注意:创建子类,继承父类时,父类必须包含在当前文件中,且位于所创建的子类前面
class Car():
--snip(省略,同上)--
#子类ElectricCar继承父类Car
class ElectricCar(Car):
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year) """注意self参数已在super()中传入,在
__init__()中将隐式传递,不需要写出(也不能写)"""
"""再初始化子类的特有属性"""
self.battery_size = 70
def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.battery_size) + "-KWh battery.")
#实例化
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name()) """这个是父类的方法,子类继承过来了,可以直接用"""
my_tesla.describe_battery() """这是子类自己新定义的方法"""
三、重写父类的方法
对于父类的方法,只要它不符合子类模拟的实物的行为,对子类毫无意义,都可以对其进行重写
方法:在子类中定义一个与父类名字一样的方法
这样的话,子类实例化运行时,会优先考虑子类中重写的这个方法,而忽略到父类中的同名方法
四、将类的实例用作属性
例如:创建一个新类Battery,把它实例化用作ElectriCar类的属性
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.")
class ElectricCar():
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_describe_name())
my_tesla.battery.describe_battery()
五、模块化简洁编程
创建一个模块文件car.py,包含只含Car类的代码
然后在另一个文件中导入并使用
"""从car.py文件(模块)中导入Car类"""
from car import Car
my_new_car = Car('audi', 'a4', 2016) #类的实例化
print(my_new_car.get_descriptive_name()) #调用Car类中的方法
my_new_car.odometer_reading = 23 #直接修改属性值
my_new_car.read_odometer() #调用Car类中的方法,打印消息