前言
思维导图
9.1 创建和使用类
使用类几乎可以模拟任何东西,下面来编写一个表示小狗的简单类Dog——表示任何小狗。
大多数小都有名字和年龄,还会蹲下和打滚
9.1.1 创建Dog类
根据约定,在Python中,首字母大写的名称指的是类。 这个类定义中的括号是空的,因为我们要从空白创建这个类。
class Dog():
"""一次模拟小狗的简单尝试"""
def __init__(self,name,age):#方法__init__(),包含三个形参。 self自动传入
"""初始化属性name和age"""
self.name=name
self.age=age
def sit(self):
'''模拟小狗被命令时蹲下 '''
print(f"{self.name.title()} rolled over!")
def roll_over(self):
"""模拟小狗被命令时打滚"""
print(f"{self.name.title()} rolled over!")
定义的两个变量都有前缀self。以self为前缀的变量都可供类中的所有方法使用,我们 还可以通过类的任何实例来访问这些变量。self.name = name获取存储在形参name中的值,并将其存储到变量name中,然后该变量被关联到当前创建的实例。self.age = age的作用与此类似
像这样可通过实例访问的变量成为属性
self代表实例本身?!
__init__初始化方法,会自动执行
self
9.1.2 根据类创建实例
class Dog():
"""一次模拟小狗的简单尝试"""
def __init__(self,name,age):#方法__init__()
"""初始化属性name和age"""
self.name=name
self.age=age
def sit(self):
'''模拟小狗被命令时蹲下 '''
print(f"{self.name.title()} rolled over!")
def roll_over(self):
"""模拟小狗被命令时打滚"""
print(f"{self.name.title()} rolled over!");
dog1=Dog('丝竹',12)
print(f"my dog's name is {dog1.name.title()}" )
1.访问属性
dog1.name 来访问dog1的属性name的值
2.调用方法
class Dog():
"""一次模拟小狗的简单尝试"""
def __init__(self,name,age):#方法__init__()
"""初始化属性name和age"""
self.name=name
self.age=age
def sit(self):
'''模拟小狗被命令时蹲下 '''
print(f"{self.name.title()} rolled over!")
def roll_over(self):
"""模拟小狗被命令时打滚"""
print(f"{self.name.title()} rolled over!");
dog1=Dog('丝竹',12)
print(f"my dog's name is {dog1.name.title()}" )
dog1.sit()
dog1.roll_over()
要调用方法,可指定实例的名称和要调用的方法,并用句点隔他们。遇 到代码my_dog.sit()时,Python在类Dog中查找法sit()并运行其代码。Python以同样的方式解读代码my_dog.roll_over()。
3.创建多个实例
class Dog():
"""一次模拟小狗的简单尝试"""
def __init__(self,name,age):#方法__init__()
"""初始化属性name和age"""
self.name=name
self.age=age
def sit(self):
'''模拟小狗被命令时蹲下 '''
print(f"{self.name.title()} rolled over!")
def roll_over(self):
"""模拟小狗被命令时打滚"""
print(f"{self.name.title()} rolled over!");
dog1=Dog('丝竹',12)
dog2=Dog("lucy",14)
print(f"you dog's name is {dog2.name.title()}")
动手试一试
class Restaurant():
def __init__(self,restaurant_name,cuisine_type):
self.name=restaurant_name
self.type=cuisine_type
def open_restaurant(self):
print(f"{self.name.title()}now is open")
restaurant1=Restaurant('w',5)
print(f"dsads {restaurant1.name.title()}")
restaurant1.open_restaurant()
9.2 使用类和实例
9.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())
在1处,我们定义了方法__init__。包含三个形参和一个self。方法__init__()接受这些形参的值,并将它们储存在根据这个类创建的实例的属性中。创建新的Car实例时,我们需要指定其制造商,型号和生产年份。
9.2.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=str(self.year) + ""+ self.make+ ''+ self.model
return long_name.title()
def read_odometer(self):
'''打印一条指出汽车里程的消息'''
print(f"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_odometer()
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
print(long_name)
def read_odometer(self):
'''打印一条指出汽车里程的消息'''
print(f"This car has {str(self.odometer_reading)} miles on it")
my_new_car=Car('audi','a4',2016)
my_new_car.get_descriptive_name()
my_new_car.read_odometer()
一个用了return,一个没用
9.3 修改属性的值
1.直接修改属性的值
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(f"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_odometer()
my_new_car.odometer_reading=23
my_new_car.read_odometer()
2.通过方法修改属性的值
名为update_odometer()
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(f"This car has {str(self.odometer_reading)} miles on it")
def update_odometer(self,mileage):
'''将里程表读数设置为指定的值'''
self.odometer_reading=mileage
my_new_car=Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(23)
my_new_car.read_odometer()
3.通过方法对属性的值进行递增
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(f"This car has {str(self.odometer_reading)} miles on it")
def update_odometer(self,mileage):
'''将里程表读数设置为指定的值'''
self.odometer_reading=mileage
def increment_odometer(self,miles):
'''将里程表读数增加指定的量'''
self.odometer_reading +=miles
my_used_car = Car('subaru','outback',2013)
print(my_used_car.get_descriptive_name())
my_used_car.update_odometer(23500)
my_used_car.read_odometer()
my_used_car.increment_odometer(100)
my_used_car.read_odometer()
9.3 继承
9.3.1 子类的方法__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=str(self.year) + ""+ self.make+ ''+ self.model
return long_name.title()
def read_odometer(self):
'''打印一条指出汽车里程的消息'''
print(f"This car has {str(self.odometer_reading)} miles on it")
def update_odometer(self,mileage):
'''将里程表读数设置为指定的值'''
self.odometer_reading=mileage
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', 2016)
print(my_tesla.get_descriptive_name())
super()函数:帮助python将父类和子类关联起来
9.3.3 给子类定义属性和方法
让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法
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(f"This car has {str(self.odometer_reading)} miles on it")
def update_odometer(self,mileage):
'''将里程表读数设置为指定的值'''
self.odometer_reading=mileage
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=70
def describe_battery(self):
'''打印一条描述电瓶容量的消息'''
print(f"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()
9.3.4 重写父类的方法
在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python就不会考虑这个父类方法,只关注你在子类中定义的相应方法
取其精华,去其糟粕!怎么使用?
9.3.5 将实例用作属性
作用:将类的一部分作为一个独立的类提取出来。你可以将大型类拆分成多个协同工作的小类。
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(f"This car has {str(self.odometer_reading)} miles on it")
def update_odometer(self, mileage):
'''将里程表读数设置为指定的值'''
self.odometer_reading = mileage
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("This car has a " + str(self.battery_size) + "-kWh battery.")
class ElectricCar(Car):
'''电动汽车的独特之处'''
def __init__(self, make, model, year):
'''初始化父类的属性'''
super().__init__(make, model, year)
self.battery_size = Battery()
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
报错了,哪里出问题?
9.3.6 模拟事物
9.4 导入类
9.4.1 导入单个类
9.4.2 在一个模块中存储多个类
9.4.4 从一个模块中导入多个类
from car import Car,ElectricCar
9.4.4 导入整个模块
1.导入整个car模块
2.创建汽车
9.4.5 导入模块中的所有类
from module_name import *
缺点:
- 没有明确地指出你使用了模块中的哪些类
- 引发名称方面的困惑
9.4.6 在一个模块中导入另一个模块
9.5 python标准库
#9.7 小结