九、类
1.创建和使用类
(1)创建Dog类 首字母大写 (名字、年龄、蹲下、打滚)
##创建类
class Dog():
"""一次模拟小狗的简单尝试"""
def __init__(self,name,age):
"""初始化属性name和age"""
self.name=name
self.age=age
def sit(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() +" is now sitting.")
def roll_over(self):
print(self.name.title() +" rolled over.")
#根据类创建实例
my_dog=Dog('willie',6)
print("My dog's name is "+ my_dog.name.title() +".")
print("My dog is "+ str(my_dog.age) +" years old.")
输出结果:
My dog's name is Willie.
My dog is 6 years old.
类中的函数(__init__,sit, roll_over)统称为方法。在这个方法的定义中,形参self 必不可少,还必须位于其他形参的前面。当Python根据类创建实例时,会自动传入实参self,所以我们不必给形参self提供值。
(2)根据类创建实例
- 访问属性
my_dog=Dog('willie',6)
print(my_dog.name)
输出结果:
willie
- 调用方法
my_dog=Dog('willie',6)
my_dog.sit()
my_dog.roll_over()
输出结果:
Willie is now sitting.
Willie rolled over.
- 创建多个实例
my_dog=Dog('willie',6)
your_dog=Dog('lucky',3)
print("My dog's name is "+ my_dog.name.title() +".")
print("My dog is "+ str(my_dog.age) +" years old.")
my_dog.sit()
print("\nYpur dog's name is "+ your_dog.name.title() +".")
print(your_dog.name.title()+" is "+ str(your_dog.age) +" years old.")
your_dog.roll_over()
输出结果:
My dog's name is Willie.
My dog is 6 years old.
Willie is now sitting.
Ypur dog's name is Lucky.
Lucky is 3 years old.
Lucky rolled over.
2.使用类和实例
(1)Car类
class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self,make,model,year):
"""初始化汽车的属性值"""
self.make=make
self.model=model
self.year=year
def get_descriptive_name(self):
"""返回整洁的描述性信息"""
long_name=str(self.year) +' '+ self.make +' '+ self.model
return long_name.title()
my_new_car=Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())
输出结果:
2016 Audi A4
(2)给属性指定默认值
给里程数指定默认值0
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=str(self.year) +' '+ self.make +' '+ self.model
return long_name.title()
def read_dodmeter(self):
"""打印一条指出汽车里程的消息"""
print("This car has "+ str(self.odometer_reading) +" miles on it.")
my_new_car=Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_dodmeter()
输出结果:
2016 Audi A4
This car has 0 miles on it.
(3)修改属性的值
- 直接修改属性的值
my_new_car=Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading=23
my_new_car.read_dodmeter()
输出结果:
2016 Audi A4
This car has 23 miles on it.
- 通过方法修改属性的值
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=str(self.year) +' '+ self.make +' '+ self.model
return long_name.title()
def read_dodmeter(self,mileage):
"""禁止将里程表读数往回调"""
if mileage >= self.odometer_reading:
self.odometer_reading=mileage
"""打印一条指出汽车里程的消息"""
print("This car has "+ str(self.odometer_reading) +" miles on it.")
else:
print("You can't roll back an odometer!")
my_used_car=Car('audi','a4',2016)
print(my_used_car.get_descriptive_name())
my_used_car.read_dodmeter(10500)
my_used_car.read_dodmeter(300)
输出结果:
2016 Audi A4
This car has 10500 miles on it.
You can't roll back an odometer!
- 通过方法对属性的值进行递增
def increment_odometer(self,miles):
self.odometer_reading += miles
print("This car has "+ str(self.odometer_reading) +" miles on it.")
my_used_car=Car('audi','a4',2016)
print(my_used_car.get_descriptive_name())
my_used_car.read_odometer(10500)
my_used_car.read_odometer(3000)
my_used_car.increment_odometer(500)
输出结果:
2016 Audi A4
This car has 10500 miles on it.
You can't roll back an odometer!
This car has 11000 miles on it.
3.继承
子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
(1)子类的方法__init__()
创建子类时,父类必须包含在当前文件中,且位于子类前面。
super() 是一个特殊函数,帮助Python将父类和子类关联起来。
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 = 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,year)
my_tesla = ElectricCar('tesla','model s',2017)
print(my_tesla.get_descriptive_name())
输出结果:
2017 Tesla Model S
(2)给子类定义属性和方法
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','model s',2017)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
输出结果:
2017 Tesla Model S
This car has a 70-kwh battery.
(3)重写父类的方法 取其精华,弃其糟粕
class ElectricCar(Car):
"""电动车的独特之处"""
def __init__(self,make,model,year):
"""初始化父类的属性"""
super().__init__(make,model,year)
self.battery_size = 70
self.odometer_reading = 1000
def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.battery_size) +"-kwh battery.")
def read_odometer(self):
#继承父类的方法
super().read_odometer()
def increment_odometer(self):
#重写父类的方法
print("This electric can't be driven.")
my_tesla = ElectricCar('tesla','model s',2017)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
my_tesla.read_odometer()
my_tesla.increment_odometer()
输出结果:
2017 Tesla Model S
This car has a 70-kwh battery.
This car has 1000 miles on it.
This electric can't be driven.
(4)将实物用作属性
可以将类的一部分作为一个独立的类提取出来,从而将大型类拆分成多个协同工作的小类。
class Battery(): #不继承任何类
"""一次模拟电动汽车电瓶的简单尝试"""
def __init__(self,battery_size=70):
"""初始化电瓶的属性"""
self.battery_size=battery_size
def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print("\nThis car has a " + str(self.battery_size) +"-kwh battery.")
def get_range(self):
"""打印一条消息,指出电瓶车的续航里程"""
if self.battery_size == 70:
range = 240
elif self.battery_size == 80:
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_tesla = ElectricCar('tesla','model s',2017)
print(my_tesla.get_descriptive_name())
my_tesla.battery.__init__(80)
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
输出结果:
2017 Tesla Model S
This car has a 80-kwh battery.
This car can go approximately 270 miles on a full charge.
4.导入类
(1)导入单个类
首先创建car.py
然后创建my_car.py,在其中导入Car类并创建其实例:
from car import Car
my_new_car=Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 24
my_new_car.read_odometer()
my_new_car.increment_odometer(500)
my_new_car.read_odometer()
输出结果:
2016 Audi A4
This car has 24 miles on it.
This car has 524 miles on it.
(2)在一个模块中存储多个类
car0.py中有多个类:
"""一组用于表示燃油汽车和电动汽车的类"""
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=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 Battery():
"""一次模拟电动汽车电瓶的简单尝试"""
def __init__(self,battery_size=70):
"""初始化电瓶的属性"""
self.battery_size=battery_size
def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print("\nThis car has a " + str(self.battery_size) +"-kwh battery.")
def get_range(self):
"""打印一条消息,指出电瓶车的续航里程"""
if self.battery_size == 70:
range = 240
elif self.battery_size == 80:
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
from car0 import ElectricCar
my_tesla = ElectricCar('tesla','model s',2017)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
输出结果:
2017 Tesla Model S
This car has a 70-kwh battery.
This car can go approximately 240 miles on a full charge.
(3)从一个模块中导入多个类
将Car 和ElectricCar 类都导入my_cars.py:
from car0 import Car,ElectricCar
my_beetle = Car('volkswagen','beetle',2018)
print(my_beetle.get_descriptive_name())
my_tesla = ElectricCar('tesla','roadster',2019)
print(my_tesla.get_descriptive_name())
输出结果:
2018 Volkswagen Beetle
2019 Tesla Roadster
(4)导入整个模块
my_cars.py:
import car0
my_beetle = car0.Car('volkswagen','beetle',2018)
print(my_beetle.get_descriptive_name())
my_tesla = car0.ElectricCar('tesla','roadster',2019)
print(my_tesla.get_descriptive_name())
(5)导入模块中的所有类(不推荐) from module_name import *
(6)在一个模块中导入另一个模块
car.py
electric_car.py:
from car import Car
class Battery():
...
class ElectricCar(Car):
...
my_cars.py:
from electric_car import ElectricCar
my_tesla = ElectricCar('tesla','roadster',2019)
print(my_tesla.get_descriptive_name())
5.Python标准库
以模块collections 中的一个类——OrderedDict(记录了键—值对的添加顺序的字典)为例:
#导入类
from collections import OrderedDict
#创建一个实例
favorite_languages = OrderedDict() #调用OrderDict()来创建一个空的有序字典
favorite_languages['jen']='python'
favorite_languages['sarah']='c'
favorite_languages['edward']='ruby'
favorite_languages['phil']='python'
for name,language in favorite_languages.items(): #以添加的顺序获取调查结果
print(name.title() +"'s favorite language is "+
language.title() +".")
输出结果:
Jen's favorite language is Python.
Sarah's favorite language is C.
Edward's favorite language is Ruby.
Phil's favorite language is Python.
参考文献:袁国忠,Python编程:从入门到实践