Python基础-11面向对象基础

一. 理解面向对象

面向对象就是将编程当成是一个事物,对外界来说,事物是直接使用的,不用去管他内部的情况。而编程就是设置事物能够做什么事。

二. 类和对象

类和对象的关系:用类去创建一个对象。

2.1 理解类和对象

2.1.1 类
类是对一系列具有相同特征行为的事物的统称,是一个抽象的概念,不是真实存在的事物。

  • 特征即是属性
  • 行为即是方法

类比如是制造洗衣机时要用到的图纸,也就是说类是用来创建对象

2.1.2 对象

对象是类创建出来的真实存在的事物,例如:洗衣机。
注意:开发中,先有类,再有对象。

2.2 面向对象实现方法

2.2.1 定义类

Python2中类分为:经典类和新式类

  • 语法
class 类名():
	代码
	......

注意:类名要满足标识符命名规则,同时遵循大驼峰命名习惯。

  • 体验
class Washer():
	def wash(self):
		print('我会洗衣服')
  • 拓拓展:经典类
class 类名:
	代码
	......

2.2.2 创建对象
对象又名实例。

  • 语法
对象名= 类名()
  • 体验
# 创建对象
haier1 = Washer()
# <__main__.Washer object at 0x0000018B7B224240>
print(haier1)
# haier对象调用实例方法
haier1.wash()

2.2.3 self
self指的是调用该函数的对象

# 1. 定义类
class Washer():
	def wash(self):
		print('我会洗衣服')
		# <__main__.Washer object at 0x0000024BA2B34240>
		print(self)
# 2. 创建对象
haier1 = Washer()
# <__main__.Washer object at 0x0000018B7B224240>
print(haier1)
# haier1对象调用实例方法
haier1.wash()

haier2 = Washer()
# <__main__.Washer object at 0x0000022005857EF0>
print(haier2)

注意:打印对象和self得到的结果是一致的,都是当前对象的内存中存储地址。

三. 添加和获取对象属性

属性即是特征,比如:洗衣机的宽度、高度、重量…
对象属性既可以在类外面添加和获取,也能在类里面添加和获取。

3.1 类外面添加对象属性
  • 语法
对象名.属性名=
  • 体验
haier1.width = 500
haier1.height = 800
3.2 类外面获取对象属性
  • 语法
对象名.属性名
  • 体验
print(f'haier1洗衣机的宽度是{haier1.width}')
print(f'haier1洗衣机的高度是{haier1.height}')
3.3 类里面获取对象属性
  • 语法
self.属性名
  • 体验
# 定义类
class Washer():
	def print_info(self):
		# 类里⾯面获取实例属性
		print(f'haier1洗衣机的宽度是{self.width}')
		print(f'haier1洗衣机的高度是{self.height}')
# 创建对象
haier1 = Washer()

# 添加实例属性
haier1.width = 500
haier1.height = 800
haier1.print_info()

四. 魔法方法

在Python中,__xx__() 的函数叫做魔法方法,指的是具有特殊功能的函数。

4.1 __init__()

4.1.1 体验__init__()
思考:洗衣机的宽度高度是与生俱来的属性,可不可以在生产过程中就赋予这些属性呢?
答:理应如此。
__init__()方法的作用:初始化对象

class Washer():
	# 定义初始化功能的函数
	def __init__(self):
	# 添加实例属性
	self.width = 500
	self.height = 800
	
def print_info(self):
	# 类里面调用实例属性
	print(f'洗衣机的宽度是{self.width}, 高度是{self.height}')
	
haier1 = Washer()
haier1.print_info()

注意:
__init__() 方法,在创建一个对象时默认被调用,不需要手动调用
__init__(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去。
4.1.2 带参数的__init__()
思考:一个类可以创建多个对象,如何对不同的对象设置不同的初始化属性呢?
答:传参数。

class Washer():
	def __init__(self, width, height):
		self.width = width
		self.height = height
	
	def print_info(self):
		print(f'洗衣机的宽度是{self.width}')
		print(f'洗衣机的高度是{self.height}')
	
haier1 = Washer(10, 20)
haier1.print_info()

haier2 = Washer(30, 40)
haier2.print_info()
4.2 __str__()

当使用print输出对象的时候,默认打印对象的内存地址。如果类定义了__str__方法,那么就会打印存在这个方法中return 的数据。

class Washer():
	def __init__(self, width, height):
		self.width = width
		self.height = height
	
	def __str__(self):
		return '这是海尔洗衣机的说明书'
haier1 = Washer(10, 20)
# 这是海尔洗衣机的说明书
print(haier1)
4.3 __del__()

当删除对象时,python解释器也会默认调用__del__() 方法。

class Washer():
	def __init__(self, width, height):
		self.width = width
		self.height = height
		
	def __del__(self):
		print(f'{self}对象已经被删除')
		
haier1 = Washer(10, 20)
# <__main__.Washer object at 0x0000026118223278>对象已经被删除
del haier1

五、综合应用

5.1 烤地瓜

需求:

  1. 被烤的时间和对应的地瓜状态:
    0-3分钟:⽣生的
    3-5分钟:半生不熟
    5-8分钟:熟的
    超过8分钟:烤糊了
  2. 添加的调料:
    用户可以按自己的意愿添加调料
# 定义类
class SweetPotato():
	def __init__(self):
		# 被烤的时间
		self.cook_time = 0
		# 地瓜的状态
		self.cook_static = '⽣生的'
		# 调料列表
	self.condiments = []
	
	def cook(self, time):
		"""烤地瓜的方法"""
		self.cook_time += time
		if 0 <= self.cook_time < 3:
		self.cook_static = '生的'
		elif 3 <= self.cook_time < 5:
		self.cook_static = '半生不熟'
		elif 5 <= self.cook_time < 8:
		self.cook_static = '熟了'
		elif self.cook_time >= 8:
		self.cook_static = '烤糊了'
	
	def add_condiments(self, condiment):
		"""添加调料"""
		self.condiments.append(condiment)
		
	def __str__(self):
	return f'这个地瓜烤了{self.cook_time}分钟, 状态是{self.cook_static}, 添加的调料有{self.condiments}'
	
digua1 = SweetPotato()
print(digua1)

digua1.cook(2)
digua1.add_condiments('酱油')
print(digua1)

digua1.cook(2)
digua1.add_condiments('辣椒面儿')
print(digua1)

digua1.cook(2)
print(digua1)

digua1.cook(2)
print(digua1)
5.2 搬家具

需求:将小于房子剩余面积的家具摆放到房子中
定义类

房子类

  • 实例属性
    ---- 房子地理位置
    ---- 房子占地面积
    ---- 房子剩余面积
    ---- 房子内家具列表
    – 实例方法
    ---- 容纳家具
    – 显示房屋信息
  • 家具类
    – 家具名称
    – 家具占地⾯面积
class Furniture():
	def __init__(self, name, area):
		# 家具名字
		self.name = name
		# 家具占地面积
		self.area = area

class Home():
	def __init__(self, address, area):
		# 地理位置
		self.address = address
		# 房屋面积
		self.area = area
		# 剩余面积
		self.free_area = area
		# 家具列表
		self.furniture = []
	def __str__(self):
		return f'房子坐落于{self.address}, 占地面积{self.area}, 剩余面积{self.free_area}, 家具有{self.furniture}'
	def add_furniture(self, item):
		"""容纳家具"""
		if self.free_area >= item.area:
			self.furniture.append(item.name)
			# 家具搬入后,房屋剩余面积= 之前剩余面积- 该家具面积
			self.free_area -= item.area
		else:
			print('家具太⼤大,剩余⾯面积不不⾜足,⽆无法容纳')

bed = Furniture('双人床', 6)
jia1 = Home('北京', 1200)
print(jia1)

jia1.add_furniture(bed)
print(jia1)

sofa = Furniture('沙发', 10)
jia1.add_furniture(sofa)
print(jia1)

ball = Furniture('篮球场', 1500)
jia1.add_furniture(ball)
print(jia1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值