python编程学习笔记⑧-1类

类将函数和数据整洁地封装起来!
类也可以看作是一大类对象都有的通用行为。
根据类创建对象称为实例化
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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值