面向对象编程(object-oriented programming,OOP):编写表示现实世界中的事物和情景的类(class)并基于这些类创建对象(object)。在编写类时,你要定义所有对象都具备的通用行为。根据类创建对象称为实例化,实例(instance)
创建类
特殊方法用行话说叫作magic method,如__getitem__,dunder-getitem,双下划线方法
类中的函数称为方法,_init_(self,...)
是一个特殊方法,其中self
形参指向实例,必不可少且必须位于首位。其他形参是基于类创建的实例的初始化属性。可通过实例访问的变量称为属性(attribute)。
Code
# 定义类
class Car:
"""表示汽车的类,存储有关汽车的信息 """
def __init__(self, make, model, year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 # 给属性指定默认值
def get_descriptive_name(self):
"""返回格式规范的描述性信息"""
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
def 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 = mileage
else:
print("错误!禁止回调!!!")
# 创建对象
my_new_car = Car('audi', 'a4', 2024)
Code
# 访问属性
my_new_car.make
my_new_car.odometer_reading
# 调用方法
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
2024 Audi A4
This car has 0 miles on it.
修改属性的值
Code
# 通过属性修改
my_new_car.odometer_reading = 55
my_new_car.odometer_reading
# 通过方法修改
my_new_car.update_odometer(100)
my_new_car.odometer_reading
my_new_car.update_odometer(24)
继承类
inheritance ,原有的类称为父类(parent class)或超类(super class),新类称为子类(child class)
子类
Code
class ElectricCar(Car): # 括号内指定父类名称
'''电动车'''
def __init__(self,make,model,year):
'''先初始化父类的属性,
再初始化电动车的特有属性'''
super().__init__(make,model,year) # 调用父类的__init__()方法
self.battery_size = 80
def battery_capacity(self):
'''打印电池容量'''
print(f'电池容量为 {self.battery_size} kWh。')
def read_odometer(self): # 重写父类中的方法
"""打印电动车里程"""
print(f"电动车已经行驶了{self.odometer_reading} 千米。")
# 创建对象
my_ECar = ElectricCar('nissan','leaf',2024)
print(my_ECar.get_descriptive_name())
my_ECar.battery_capacity()
my_ECar.read_odometer()
2024 Nissan Leaf
电池容量为 80 kWh。
电动车已经行驶了0 千米。
类的组合(composition)
Code
class Battery:
'''电池信息'''
def __init__(self,manufacture="BYD",material="Lithium_plomers",capacity=100):
self.manufacture = manufacture
self.material = material
self.capacity = capacity
def get_descriptive_name(self):
"""返回格式规范的描述性信息"""
long_name = f"{self.manufacture} {self.material} {self.capacity}"
return long_name.title()
def print_battery_capacity(self):
'''打印电池容量'''
print(f'电池容量为 {self.capacity} kWh。')
class ElectricCar2(Car):
'''电动车'''
def __init__(self,make,model,year,):
super().__init__(make,model,year) # 调用父类的__init__()方法
self.battery = Battery()
my_Ecar2 = ElectricCar2("nissan","leaf",2024)
my_Ecar2.battery.print_battery_capacity()
my_Ecar2.battery.get_descriptive_name()
'Byd Lithium_Plomers 100'