2026/1/12 类2

5 阅读8分钟
  • 上周五-周天,日均一场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()