目录
一、创建和使用类
类是面向对象的编程,使用类可以模拟很多东西;
1.创建 Plane 类
通过创建 飞机 类,可以表示飞机的共同属性。对于大多数飞机都有着它独特(不强调独特,强调都有)的 名字 和 编号 ,并且几乎所有的飞机都有 起飞 和 着陆 两个动作;
根据 Plane 类 创建的每个实例都将存储 名字 和 编号 ,并且赋予每个 plane 都具备起飞“ takeoff ( ) ”和着陆“ land ( ) ”的能力。
class Plane:
'''模拟飞机'''
def __init__(self,name,numbering):
'''初始化属性 name 和 numbering '''
self.name = name
self.numbering = numbering
def takeoff (self):
'''模拟飞机接收到命令时起飞'''
print(f"{self.name} is now takeoff")
def land (self):
'''模拟飞机接收到命令时着陆'''
print(f"{self.name} land now!")
约定:① 代表代码第一行;
讲解:
① 定义了一个 Plane 类 。在 Python 中,首字母大写的名称指向类;
② 编写文档字符串,对类的功能进行描述;
④ __init__( ) 是一个特殊方法:每当根据 Plane 类 创建实例时,Python 都会自动运行它。其中,init 两边都有两条英文下划线,这是种约定。在这个方法定义中的 self 必不可少,并且必须位于首位。当 Python 调用这个方法来创建 Plane 实例时,将自动传入实参 self 。每个与实例相关联的方法调用都自动传递实参 self ,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。创建 Plane 实例时,Python 将调用 Plane 类 的方法 __init__( ) 。我们将通过实参向 Plane ( ) 传递名字和编号。self 会自动传递,因此不需要传递它。每当根据 Plane 类 创建实例时,都只需给最后两个形参(name 和 numbering)提供值。
⑥ ⑦ 两行代码定义的两个变量都有前缀 self 。以 self 为前缀的变量可供类中的所有方法所使用,可以通过类的任何实例来访问。self.name = name 获取与形参 name 相关联的值,并将其赋给变量 name ,然后该变量被关联到当前创建的实例。像这样可通过实例访问的变量成为属性。
2.根据类创建实例
可将 类 视为有关如何创建实例的 说明 ;
class Plane:
'''模拟飞机'''
def __init__(self,name,numbering):
'''初始化属性 name 和 numbering '''
self.name = name
self.numbering = numbering
def takeoff (self):
'''模拟飞机接收到命令时起飞'''
print(f"{self.name} is now takeoff")
def land (self):
'''模拟飞机接收到命令时着陆'''
print(f"{self.name} land now!")
my_plane = Plane('UAV',666666) #创建一个实例,名称为 UAV ,编号为 666666 ,将实例赋给 UAV 变量
print(f'My plane name is {my_plane.name}.' )
print(f'My plane numbering is {my_plane.numbering}.' )
#运行结果
My plane name is UAV.
My plane numbering is 666666.
说明:通过方法 __init__( ) 创建一个表示特定飞机的实例,并使用提供的值来设置属性 name 和 numbering ,并将实例赋给变量 my_plane 。在约定中,大写字母开头的往往为 类 ,小写字母开头的,一般表示 实例。
(1)访问属性
访问实例的属性,使用句点表示法;
my_plane.name
(2)调用方法
调用实例的方法,同使用句点表示法;
class Plane:
'''模拟飞机'''
def __init__(self,name,numbering):
'''初始化属性 name 和 numbering '''
self.name = name
self.numbering = numbering
def takeoff (self):
'''模拟飞机接收到命令时起飞'''
print(f"{self.name} is now takeoff")
def land (self):
'''模拟飞机接收到命令时着陆'''
print(f"{self.name} land now!")
my_plane = Plane('UAV',666666) #创建一个实例,名称为 UAV ,编号为 666666 ,将实例赋给 UAV 变量
print(f'My plane name is {my_plane.name}.' )
print(f'My plane numbering is {my_plane.numbering}.' )
my_plane.takeoff()
my_plane.land()
#运行结果
My plane name is UAV.
My plane numbering is 666666.
UAV is now takeoff
UAV land now!
(3)创建多个实例
说明:每个实例都存储在不同变量中,或者占用列表或字典的不同位置;
二、继承
情况:如果要编写的类是另一个现成类的特殊版本,可以使用继承。一个类继承另一个类时,将自动获得另一个类的所有属性和方法。原有类成为父类,新类称为子类。子类继承了父类的所有属性和方法,同时还定义自己的属性和方法。
1.子类的方法__init__( )
说明:在既有类的基础上编写新类时,通常要调用父类的方法 __init__( ) 。这将初始化在父类 __init__( ) 方法中定义的所有属性,从而让子类包含这些属性。
下面,通过电动汽车类对汽车类的继承展开讲解:
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("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, year)
my_car = ElectricCar('python3','pro','2023')
print(my_car.get_descriptive_name())
#运行结果
2023Python3Pro
说明:
创建子类时,父类必须包含在当前文件中,且位于子类前面。
定义子类时,必须在圆括号内指定父类的名称。
第 29 行代码处的 super ( ) 是一个特殊函数,让你能够调用父类方法。这行代码让 Python 调用 Car类 的方法__init__( ) ,让 ElectricCar 实例包含这个方法中定义的所有属性。父类也称为超类(superclass),名称 super 由此而来。
有关 super ( ) 函数更深入的理解,请参考:【python】B站最细致的super()详解,一定有你不知道的知识!_哔哩哔哩_bilibili
2.给子类定义属性和方法
让一个类继承另一个类后,就可以添加区分子类的父类所需的新属性和新方法了。
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("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, year)
self.battery_size = 75
def describe_battery(self):
'''打印一条描述电瓶容量的信息'''
print(f'This car has a {self.battery_size}-kwh battery.')
my_car = ElectricCar('python3','pro','2023')
print(my_car.get_descriptive_name())
my_car.describe_battery()
#运行结果
2023Python3Pro
This car has a 75-kwh battery.
3.父类方法的重写
假设 Car 类 中有一个名为 fill_gas_tank ( ) 的方法,它对全电动汽车来说毫无意义。
class ElectricCar(Car):
--snip--
def fill_gas_tank(self):
print("This car doesn't need a gas tank")
现在,如果再调用方法 fill_gas_tank ( ) ,Python 将忽略 Car 类 中的方法 fill_gas_tank ( ) 。
4.将实例用作属性
可将类中的一部分提取出来,作为一个独立的类,从而将大型类拆分成多个协同工作的小类。
例如:我们可以将电动汽车电瓶的属性和方法提取出来,放到一个新类 Battery ,并将一个 Battery 实例作为 ElectricCar 类 的属性。
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("You can't roll back an odometer!")
def increment_odometer(self,miles):
self.odometer_reading += miles
class Battery:
def __init__(self,battery_size = 75):
self.battery_size = battery_size
def describe_battery(self):
print(f'This car has a {self.battery_size} - kwh battery.')
class ElectricCar(Car):
def __init__(self,make,model,year):
super().__init__(make,model,year)
self.battery = Battery()
my_car = ElectricCar('python3','pro','2023')
print(my_car.get_descriptive_name())
my_car.battery.describe_battery()
#运行结果
2023Python3Pro
This car has a 75 - kwh battery.
说明:
① 第 26 行代码处,定义了一个名为 Battery 的新类,它没有继承任何类。
② 第 27 行代码处,方法 __init__( ) 除 self 外还添加了一个命名为 battery_size 的形参,默认值设为75,方法 describe_battery ( ) 也移到了这个类中。
③ 第36行代码处,创建一个新的 Battery 实例,并将该实例赋给属性 self.battery 。
三、导入类
我们在文件 car.py 中定义 Car 类、ElectricCar 类、Battery 类,然后以下操作将会在其他文件里导入这些类。
1.导入单个类
from car import Car
my_car = Car('python3','500','2023')
2.导入多个类
from car import Car,ElectricCar
my_car = Car('python3','500','2023')
my_new_car = ElectricCar('python3-new','500s','2023')
3.导入整个模块
import car
#导入整个模块 car ,使用句点表示法访问需要的类
my_car = car.Car('python3','500','2023')
my_new_car = car.ElectricCar('python3-new','500s','2023')
4.使用别名
from car import ElectricCar as EC
my_new_car = EC('python3-new','500s','2023')
说明:可以通过 import A as B 的方式将 原A 取一个新命名为 B 。
最新动态,请关注微信公众号:回不去的明天