类将函数和数据整洁地封装起来!
类也可以看作是一大类对象都有的通用行为。
根据类创建对象称为实例化
9.1创建和使用类
约定:首字母大写的名称指的是类
9.1.1创建Dog类
类中的函数称为方法
方法__init__()
特殊方法是在方法名称前后都有两个下划线 方法名称 这种特殊的方法是在根据类创建实例的时候python都会自动的运行它。
在下面的示例中,特殊方法_init_的第一个形参是self,它是一个指向实例本身的引用。self是不需要提供值的。
class Dog:
"""一次模拟小狗的简单尝试"""
def __init__(self, name, age):
"""初始化属性name和age"""
self.name = name
self.age = age
def sit(self):
"""模拟小狗收到的命令时蹲下"""
print(f"{self.name} is now sitting.")
def roll_over(self):
"""模拟小狗收到命令时打滚"""
print(f"{self.name} rolled over!")
9.1.2根据类创建实例
my_dog = Dog('willie', 6)#首字母大写的是类(这是个约定)
print(f"My dog's name is {my_dog.name}")
print(f"My dog is {my_dog.age} years old.")
1、访问属性
句点表示法
my_dog.name
使用的是赋值给my_dog的变量+方法的形参,来访问属性,得到实参也就是值
2、调用方法
同样使用句点表示法
赋值变量+句点+类中的方法
my_dog.sit()
my_dog.roll_over()
3、创建多个实例
my_dog = Dog('willie', 6)
your_dog = Dog('lucy', 5)
print(f"My dog's name is {my_dog.name}")
print(f"My dog is {my_dog.age} years old.")
my_dog.sit()
print(f"My dog's name is {my_dog.name}")
print(f"My dog is {my_dog.age} years old.")
your_dog.roll_over()
练习9-1:餐馆
class Restaurant:
"""模拟餐馆的类"""
def __init__(self, restaurant_name, cuisine_type):
"""初始化餐馆属性Restaurant_name和cuisine_type"""
self.restaurant_name = restaurant_name
self.cuisine_type = cuisine_type
def describe_restaurant(self):
"""描述餐厅"""
print(f"这是一家{self.restaurant_name}餐馆,它有{self.cuisine_type}")
def open_restaurant(self):
"""营业时间"""
print(f"{self.restaurant_name}正在营业,欢迎光临!")
restaurant = Restaurant('四川菜餐厅', '四川菜')
print(restaurant.restaurant_name)
print(restaurant.cuisine_type)
restaurant.describe_restaurant()
restaurant.open_restaurant()
输出:
四川菜餐厅
四川菜
这是一家四川菜餐厅餐馆,它有四川菜
四川菜餐厅正在营业,欢迎光临!
[Finished in 0.1s]
练习9-2:三家餐馆
class Restaurant:
"""模拟餐馆的类"""
def __init__(self, restaurant_name, cuisine_type):
"""初始化餐馆属性Restaurant_name和cuisine_type"""
self.restaurant_name = restaurant_name
self.cuisine_type = cuisine_type
def describe_restaurant(self):
"""描述餐厅"""
print(f"这是一家{self.restaurant_name}餐馆,它有{self.cuisine_type}")
def open_restaurant(self):
"""营业时间"""
print(f"{self.restaurant_name}正在营业,欢迎光临!")
laoliu_restanrant = Restaurant('老刘', '各种鞭')
laoliu_restanrant.describe_restaurant()
print('\n')
laoli_restanrant = Restaurant('老李', '日本菜')
laoli_restanrant.describe_restaurant()
print('\n')
gouzi_restaurant = Restaurant('狗子', '各色鸡肉')
gouzi_restaurant.describe_restaurant()
输出:
这是一家老刘餐馆,它有各种鞭
这是一家老李餐馆,它有日本菜
这是一家狗子餐馆,它有各色鸡肉
[Finished in 0.1s]
练习9-3:用户
class User:
"""创建以个User的类"""
def __init__(self, first_name, last_name, ages):
"""初始化用户的名和姓"""
self.first_name = first_name
self.last_name = last_name
self.ages = ages
def describe_user(self):
"""用户信息摘要"""
fuall_name = self.last_name + self.first_name
print(f"这个用户叫:{fuall_name},今年{self.ages}")
def greet_user(self):
"""问候用户"""
fuall_name = self.last_name + self.first_name
print(f"你好{fuall_name}")
l_user = User('钢炮', '李', 40)
l_user.describe_user()
w_user = User('壳郎', '王', 45)
w_user.describe_user()
w_user.greet_user()
p_user = User('丽丽', '裴', 37)
p_user.greet_user()
p_user.describe_user()
输出:
这个用户叫:李钢炮,今年40
这个用户叫:王壳郎,今年45
你好王壳郎
你好裴丽丽
这个用户叫:裴丽丽,今年37
[Finished in 0.1s]
9.2使用类和实例
9.2.1 Car类
9.2.2给属性指定默认值
9.2.3修改属性的值
1、直接修改属性的值
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# 返回值
def read_odometer(self):
"""打印出汽车的里程信息"""
print(f"这辆车的里程数为:{self.odometer_reading}")
#2、通过方法修改属性的值
def update_odometer(self, mileage):
"""将里程表读数设置为指定的值"""
self.odometer_reading = mileage
my_new_car = Car('audi', 'a4', '2019')
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
#1、直接修改属性的值,使用句点表示法访问设置汽车的属性。
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
#2、通过方法修改属性的值(这对应的上面的2)
my_new_car.update_odometer(500)
my_new_car.read_odometer()
输出:
2019 audi a4
这辆车的里程数为:0
这辆车的里程数为:23
这辆车的里程数为:500
[Finished in 0.1s]
通过方法修改属性的值我们可以延展下进行一个if判断
"""将里程表读数设置为指定的值
禁止将里程表读数往回调
"""
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print(f"你无权修改里程表")
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# 返回值
def read_odometer(self):
"""打印出汽车的里程信息"""
print(f"这辆车的里程数为:{self.odometer_reading}")
#2、通过方法修改属性的值
def update_odometer(self, mileage):
"""将里程表读数设置为指定的值"""
"""将里程表读数设置为指定的值
禁止将里程表读数往回调
"""
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print(f"你无权修改里程表")
my_new_car = Car('audi', 'a4', '2019')
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(-1)
my_new_car.read_odometer()
输出:
2019 audi a4
你无权修改里程表
这辆车的里程数为:0
[Finished in 0.1s]
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 = f"{self.year} {self.make} {self.model}"
return long_name# 返回值
def read_odometer(self):
"""打印出汽车的里程信息"""
print(f"这辆车的里程数为:{self.odometer_reading}")
#2、通过方法修改属性的值
def update_odometer(self, mileage):
"""将里程表读数设置为指定的值"""
"""将里程表读数设置为指定的值
禁止将里程表读数往回调
"""
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print(f"你无权修改里程表")
def increment_odometer(self, miles):
"""将里程表读数增加指定的量(递增)"""
self.odometer_reading += miles #注意递增使用运算符+=
my_new_car = Car('audi', 'a4', '2019')
print(my_new_car.get_descriptive_name())
#将车辆里程表设置为100
my_new_car.update_odometer(100)
my_new_car.read_odometer()
#在递增里程表200
my_new_car.increment_odometer(200)
my_new_car.read_odometer()
输出:
2019 audi a4
这辆车的里程数为:100
这辆车的里程数为:300
[Finished in 0.1s]
有一个问题如果把递增这个方法的实参设置为负数,得到的结果不是我们想要的。我们可以使用if判断。
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# 返回值
def read_odometer(self):
"""打印出汽车的里程信息"""
print(f"这辆车的里程数为:{self.odometer_reading}")
#2、通过方法修改属性的值
def update_odometer(self, mileage):
"""将里程表读数设置为指定的值"""
"""将里程表读数设置为指定的值
禁止将里程表读数往回调
"""
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("你无权修改里程表")
def increment_odometer(self, miles):
"""将里程表读数增加指定的量(递增)"""
if miles >= 0:
self.odometer_reading += miles #注意递增使用运算符+=
else:
print("请勿非法修改里程表")
my_new_car = Car('audi', 'a4', '2019')
print(my_new_car.get_descriptive_name())
#将车辆里程表设置为100
my_new_car.update_odometer(100)
my_new_car.read_odometer()
#在递增里程表200
my_new_car.increment_odometer(-50)
my_new_car.read_odometer()
输出:
2019 audi a4
这辆车的里程数为:100
请勿非法修改里程表
这辆车的里程数为:100
[Finished in 0.1s]
练习9-4:就餐人数
class Restaurant:
"""模拟餐馆的类"""
def __init__(self, restaurant_name, cuisine_type):
"""初始化餐馆属性Restaurant_name和cuisine_type"""
self.restaurant_name = restaurant_name
self.cuisine_type = cuisine_type
self.number_served = 0
def describe_restaurant(self):
"""描述餐厅"""
print(f"这是一家{self.restaurant_name}餐馆,它有{self.cuisine_type}")
def open_restaurant(self):
"""营业时间"""
print(f"{self.restaurant_name}正在营业,欢迎光临!")
def repast_number(self):
"""就餐人数"""
print(f"今天就餐的人数是{self.number_served}")
def set_number_served(self, number):
"""设置就餐人数"""
self.number_served = number
def increment_number_served(self, numbers):
"""递增人数"""
self.number_served += numbers
restaurant = Restaurant('四川菜餐厅', '四川菜')
restaurant.describe_restaurant()
restaurant.open_restaurant()
restaurant.repast_number()
print("过了2个小时")
restaurant.number_served = 5
restaurant.repast_number()
print("时间又过了30分钟")
restaurant.set_number_served(10)
restaurant.repast_number()
print("今天营业结束一共就餐了")
restaurant.increment_number_served(57)
restaurant.repast_number()
输出:
这是一家四川菜餐厅餐馆,它有四川菜
四川菜餐厅正在营业,欢迎光临!
今天就餐的人数是0
过了2个小时
今天就餐的人数是5
时间又过了30分钟
今天就餐的人数是10
今天营业结束一共就餐了
今天就餐的人数是67
[Finished in 0.1s]
练习9-5:尝试登陆次数
class User:
"""创建以个User的类"""
def __init__(self, first_name, last_name, ages):
"""初始化用户的名和姓"""
self.first_name = first_name
self.last_name = last_name
self.ages = ages
self.login_attempts = 0
def describe_user(self):
"""用户信息摘要"""
fuall_name = self.last_name + self.first_name
print(f"这个用户叫:{fuall_name},今年{self.ages}")
def greet_user(self):
"""问候用户"""
fuall_name = self.last_name + self.first_name
print(f"你好{fuall_name}")
def increment_login_attempts(self):
"""将login_attempet设置为1"""
self.login_attempts += 1
def reset_login_attempts(self):
"""重置为0"""
self.login_attempts = 0
p_user = User('丽丽', '裴', 37)
p_user.describe_user()
p_user.greet_user()
print("\n尝试3次登录...")
p_user.increment_login_attempts()
p_user.increment_login_attempts()
p_user.increment_login_attempts()
print(f"用户已经登录{p_user.login_attempts}次")
print("\n重置尝试登录")
p_user.reset_login_attempts()
print(f"重置为{p_user.login_attempts}")
输出:
这个用户叫:裴丽丽,今年37
你好裴丽丽
尝试3次登录...
用户已经登录3次
重置尝试登录
重置为0
[Finished in 0.1s]