- 上周五-周天,日均一场2小时以上的网球比赛,整个人基本废了,但是明显感觉自己涨球了,接了好多个对方的前场扣杀,打出了好多个绝地防守反击的好球,开心到飞起。
- 给自己用了植入式血糖检测仪,好吧,胰岛素抵抗还是顽强的存在着:拿自己做了好几组对比实验,发现真的不能吃精细主食,血糖那叫一个火箭飞跃,想哭。
- 今天复习了类的第二部分,发现,慢慢的会犯一些拼写错误,然后一些东西开始不太理解了,下面附上笔记,以及我不太懂的地方。
2.使用类和实例
汽车信息 car.py
class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self,make,model,year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
def get_descriptive_name(self):
"""返回格式规范的描述性信息"""
long_name =f"{self.year} {self.make} {self.model}"
return long_name.title()
my_new_car = Car('audi','a4',2024)
print(my_new_car.get_descriptive_name())
# 》2024 Audi A4
- 给属性指定默认值
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.")
my_new_car = Car('audi','a4',2024)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
# 》2024 Audi A4
# 》This car has 0 miles on it.
- 修改属性的值 直接修改属性值
class Car:
--snip--
my_new_car = Car('audi','a4',2024)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
通过方法修改属性值
class Car:
--snip--
def update_odometer(self,mileage):
"""将里程表读数设置为指定的值"""
self.odometer_reading = mileage
my_new_car = Car('audi','a4',2024)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(23)
my_new_car.read_odometer()
方法扩展
class Car:
--snip--
def update_odometer(self,mileage):
"""
将里程表读数设置为指定的值
禁止将里程表读数往回调
"""
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back an 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 = f"{self.year} {self.make} {self.model}"
return long_name.title()
def update_odometer(self,mileage):
"""将里程表读数设置为指定的值"""
self.odometer_reading = mileage
def read_odometer(self):
"""打印一条指出汽车行驶里程的消息"""
print(f"This car has {self.odometer_reading} miles on it.")
def increment_odometer(self,miles):
"""让里程表读数增加指定的量"""
self.odometer_reading += miles
my_used_car = Car('subaru','outback',2019)
print(my_used_car.get_descriptive_name())
my_used_car.update_odometer(23_500)
my_used_car.read_odometer()
my_used_car.increment_odometer(100)
my_used_car.read_odometer()
# 》2019 Subaru Outback
# 》This car has 23500 miles on it.
# 》This car has 23600 miles on it.
练习
class Restaurant:
"""餐厅类"""
def __init__(self, name, cuisine_type):
"""初始化餐厅属性"""
self.name = name
self.cuisine_type = cuisine_type
self.customers_served = 0
def describe(self):
"""描述餐厅信息"""
print("🍽️ 餐厅信息:")
print(f" 名称: {self.name}")
print(f" 菜系: {self.cuisine_type}")
print(f" 已服务客户: {self.customers_served} 人")
print()
def open(self):
"""宣布开业"""
print(f"🚪 {self.name} 开门营业啦!")
def set_customers(self, number):
"""设置客户数量"""
if number >= 0:
self.customers_served = number
print(f"✅ 已设置客户数量为: {number}")
else:
print("❌ 客户数量不能为负数!")
def add_customers(self, additional):
"""增加客户数量"""
if additional > 0:
self.customers_served += additional
print(f"➕ 新增 {additional} 位客户")
else:
print("❌ 增加数量必须为正数!")
# 测试
print("=" * 50)
print("餐厅管理系统")
print("=" * 50)
# 创建实例
my_restaurant = Restaurant("沙县小吃", "中式快餐")
# 显示初始信息
print("\n1. 初始状态:")
my_restaurant.describe()
# 营业
my_restaurant.open()
print()
# 直接修改属性
print("2. 直接修改属性:")
my_restaurant.customers_served = 50
print(f"直接设置 customers_served = 50")
my_restaurant.describe()
# 使用方法设置
print("3. 使用方法设置:")
my_restaurant.set_customers(200)
my_restaurant.describe()
# 增加客户
print("4. 增加客户:")
my_restaurant.add_customers(300)
my_restaurant.describe()
# 测试错误输入
print("5. 测试错误输入:")
my_restaurant.set_customers(-10) # 负数
my_restaurant.add_customers(0) # 零
print()
# 最终状态
print("6. 最终状态:")
my_restaurant.describe()
尝试登录次数
class User:
"""创建一般用户类"""
def __init__(self,first_name,last_name,location,age):
self.first_name = first_name
self.last_name = last_name
self.location = location
self.age = age
self.login_attempts = 0
def describe_user(self):
print(f"The user's name is {self.first_name.title()} {self.last_name.title()}."
f"\n{self.first_name.title()} lives in {self.location.title()}."
f"\n{self.first_name.title()} is {self.age} years old.")
def greet_user(self):
print(f"Hello,{self.first_name.title()}.")
def increment_login_attempts(self):
self.login_attempts += 1
print(f"检验:目前login_attempts的值为{self.login_attempts}.")
def reset_login_attempts(self):
"""将login_attempts重置为0"""
slef.login_attempts = 0
print(f"检验:目前login_attempts的值为{self.login_attempts}.")
user1 = User('tracy','an','shanghai',34)
user2 = User('coco','cai','shanghai',8)
user3 = User('menglei','cai','shanghai',33)
user1.describe_user()
user1.greet_user()
user1.increment_login_attempts()
user1.reset_login_attempts()
print()
user2.describe_user()
user2.greet_user()
user2.increment_login_attempts()
user2.reset_login_attempts()
print()
user3.describe_user()
user3.greet_user()
user3.increment_login_attempts()
user3.reset_login_attempts()
3. 继承
- 子类的init方法——初始化父类(超类)方法中定义的所有属性,使得子类也可以使用这些属性。 electric_car.py 具备所有Car类的功能
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_leaf = ElectricCar('nissan','leaf',2024)
print(my_leaf.get_descriptive_name())
# 》2024 Nissan Leaf
- 给子类定义属性和方法
class Car:
--snip--
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self,make,model,year):
"""
先初始化父类的属性,再初始化电动汽车特有的属性
"""
super().__init__(make,model,year)
self.battery_size = 40
def describe_battery(self):
"""打印一条描述电池容量的消息"""
print(f"This car has a {self.battery_size}-kWh battery.")
my_leaf = ElectricCar('nissan','leaf',2024)
print(my_lear.get_descriptive_name())
my_leaf.describe_battery()
-
也可以直接在子类中重新父类中的方法,这样在执行过程中,将会忽视父类的而执行子类中的新的方法。
-
将实例用作属性 将大型类拆分成多个协调工作的小类,这种方法称为组合。 可将针对类的某一方面的属性和方法提取出来,整合到专有的类中,并将一个这个类的实例作为子类的属性
class Car:
--snip--
class Battery:
"""一次模拟电动汽车电池的简单尝试"""
def __init__(self,battery_size=40):
"""初始化电池的属性"""
self.battery_size = battery_size
def describe_battery(self):
"""打印一条描述电池容量的消息"""
print(f"This car has a {self.battery_size}-kWh battery.")
def get_range(self):
"""打印一条信息,指出电池的续航里程"""
if self.battery_size == 40:
range = 150
elif self.battery_size == 65:
range = 225
print(f"This car can go about {range} miles on a full charge.")
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self,make,model,year):
"""
先初始化父类的属性,再初始化电动汽车特有的属性
"""
super().__init__(make,model,year)
self.battery = Battery() # 类的实例作为子类属性
my_leaf = ElectricCar('nissan','leaf',2024)
print(my_leaf.get_descriptive_name())
my_leaf.battery.describe_battery()
my_leaf.battery.get_range()
# 》2024 Nissan Leaf
# 》This car has a 40-kWh battery.
# 》This car can go about 150 miles on a full charge.
练习
冰淇淋小店
class Restaurant:
"""尝试一个定义餐馆的类"""
def __init__(self,restaurant_name,restaurant_type):
self.restaurant_name = restaurant_name
self.restaurant_type = restaurant_type
def describe_restaurant(self):
print(f"{self.restaurant_name}.")
print(f"{self.restaurant_type}.")
def open_restaurant(self):
print(f"The {self.restaurant_name} is open.")
class IceCreamStand(Restaurant):
def __init__(self,restaurant_name,restaurant_type):
super().__init__(restaurant_name,restaurant_type)
self.flavors = ['香草','榴莲','芒果']
def describe_icecream(self,number):
"""定义并打印flavor"""
self.flavor = self.flavors[number]
print(f"你在{self.restaurant_name} 这家 {self.restaurant_type}店订购了{self.flavor}口味的冰淇淋。")
icecream = IceCreamStand("Shaqimu","甜品店")
icecream.describe_icecream(0)
# 》你在Shaqimu 这家 甜品店店订购了香草口味的冰淇淋。
管理员
class User:
"""创建一般用户类"""
def __init__(self,first_name,last_name,location,age):
self.first_name = first_name
self.last_name = last_name
self.location = location
self.age = age
self.login_attempts = 0
def describe_user(self):
print(f"The user's name is {self.first_name.title()} {self.last_name.title()}."
f"\n{self.first_name.title()} lives in {self.location.title()}."
f"\n{self.first_name.title()} is {self.age} years old.")
def greet_user(self):
print(f"Hello,{self.first_name.title()}.")
def increment_login_attempts(self):
self.login_attempts += 1
print(f"检验:目前login_attempts的值为{self.login_attempts}.")
def reset_login_attempts(self):
#将login_attempts重置为0
self.login_attempts = 0
print(f"检验:目前login_attempts的值为{self.login_attempts}.")
class Admin(User):
def __init__(self,first_name,last_name,location,age):
"""定义Admin的类的属性和方法"""
super().__init__(first_name,last_name,location,age)
self.privileges = ['can add post','can delete post','can ban user']
def show_privileges(self):
"""打印管理员的权限"""
print("作为管理员,具有权限如下:")
for i in self.privileges:
print(f"\n{i}")
user1 = Admin('tracy','an','shanghai',34)
user1.describe_user()
print()
user1.show_privileges()
==也可以利用类的实例用作子类属性值的方式调用==
class User:
"""创建一般用户类"""
def __init__(self,first_name,last_name,location,age):
self.first_name = first_name
self.last_name = last_name
self.location = location
self.age = age
self.login_attempts = 0
def describe_user(self):
print(f"The user's name is {self.first_name.title()} {self.last_name.title()}."
f"\n{self.first_name.title()} lives in {self.location.title()}."
f"\n{self.first_name.title()} is {self.age} years old.")
def greet_user(self):
print(f"Hello,{self.first_name.title()}.")
def increment_login_attempts(self):
self.login_attempts += 1
print(f"检验:目前login_attempts的值为{self.login_attempts}.")
def reset_login_attempts(self):
#将login_attempts重置为0
self.login_attempts = 0
print(f"检验:目前login_attempts的值为{self.login_attempts}.")
class Privileges:
"""定义权限的属性"""
def __init__(self,privileges= ['can add post','can delete post','can ban user']):
self.privileges = privileges
# 这里就不太明白,为什么必须把列表写在参数里呢?因为是作为默认值吗?如果我像上述写法,写在赋值里面,就报错,可是如果这样的话,后期要修改列表值,还要重新定义类了。明天研究一下。
def show_privileges(self):
"""打印管理员的权限"""
print("作为管理员,具有权限如下:")
for i in self.privileges:
print(f"\n{i}")
class Admin(User):
def __init__(self,first_name,last_name,location,age):
"""定义Admin的类的属性和方法"""
super().__init__(first_name,last_name,location,age)
self.privileges = Privileges()
user1 = Admin('tracy','an','shanghai',34)
user1.describe_user()
print()
user1.privileges.show_privileges()