面向对象是一种抽象化的编程思想,狠多变成语言中都有的一种思想
例如:洗衣服
思考:几种途径可以完成洗衣服?
答:手洗和机洗。
手洗:找盆–防水–加洗衣粉–浸泡–搓洗–拧干水–倒水–漂洗N次–拧干–晾晒。
机洗:打开洗衣机–放衣服–加洗衣粉–按下开始按钮–晾晒。
思考:对比两种洗衣服途径。
答:机洗更简单。
思考:机洗只需要用到一台洗衣机,加入简单操作就可以完成洗衣服的工作,而不需要关心洗衣机内部发生了什么事情。
总结:面向对象就是将变成当成一个事物,对外界来说,事物是直接使用的,不用去管他内部的情况。而编程就是设置事物能够做什么事。
事物→洗衣机
编程→设置洗衣机的功能
思考:接上篇,洗衣机洗衣服描述过程中,洗衣机其实就是一个事物,即对象,洗衣机对象哪里来的呢?
答:洗衣机是由工厂工人制造出来的。
思考:工厂工人怎么制作出的洗衣机?
答:工人根据设计师设计的功能图纸制作洗衣机。
总结:图纸→洗衣机→洗衣服
在面向编程过程中,有两个重要组成部分:类和对象。
类 相当于是 图纸。
对象 相当于是 洗衣机。
类和对象的关系:用类去创建一个对象。
创建也可以称为实例化。
类去实例化对象。
类是对一系列具有相同特征和行为的事物的统称,是一个抽象的概念,不是真实存在的事物。
类比如是制造洗衣机时要用到的图纸,也就是说类是用来创建对象。
对象是创建出来的真实存在的事物,例如:洗衣机。
注意:在开发中,先有类,再有对象。
class 类名():
代码
......
注意:类名要满足标识符命名规则,同时遵循大驼峰命名习惯。
对象又名实例。
对象名 = 类名()
# 需求:洗衣机,功能:洗衣服
# 1. 定义洗衣机类
'''
class 类名():
代码
'''
class Washer():
def wash(self):
print('能洗衣服')
# 2. 创建步骤
# 对象名 = 类名()
haier = Washer()
# 3. 验证成果
# 打印haier对象
print(haier) # <__main__.Washer object at 0x0000024DEF6FDC30>
# 打印对象的地址成功,说明创建对象成功
# 使用wash功能 -- 实例方法/对象方法 -- 对象名.wash()
haier.wash() # 能洗衣服
self指的是调用该函数的对象。
# 类:洗衣机 功能:洗衣服
class Washer():
def wash(self):
print('洗衣服')
print(self)
haier = Washer()
print(haier) # <__main__.Washer object at 0x000001ABAFECD1B0>
haier.wash() # <__main__.Washer object at 0x000001ABAFECD1B0>
由于打印对象和打印self得到的内存地址相同,所以self指的是调用该函数的对象
测试:
class Washer():
def wash(self):
print('洗衣服')
print(self)
haier1 = Washer()
haier1.wash() # <__main__.Washer object at 0x000001C75C22D1B0>
haier2 = Washer()
haier2.wash() # <__main__.Washer object at 0x000001C75C22DC00>
两次地址不同,说明调用成功
属性即是特征,比如:洗衣机的宽度、高度、重量…
对象属性既可以在类外面添加和获取,也能在类里添加和获取。
对象名.属性名 = 值
class Washer():
def wash(self):
print('洗衣服')
haier1 = Washer()
haier1.width = 500
haier1.heiht = 800
print(Washer())
对象名.属性名
class Washer():
def wash(self):
print('洗衣服')
# 添加属性名
haier1 = Washer()
haier1.width = 500
haier1.height = 800
# 获取对象属性
print('haier1洗衣机的宽度为{}'.format(haier1.width))
print('haier1洗衣机的宽度为{}'.format(haier1.height))
self.属性名
class Washer():
def wash(self):
print('洗衣服')
# 获取对象属性
def print_info(self):
# self.属性名
print(f'洗衣机的宽度是{self.width}')
print(f'洗衣机的高度是{self.height}')
# 添加属性名
haier1 = Washer()
haier1.width = 500
haier1.height = 800
# 对象调用实例方法
haier1.print_info()
'''
洗衣机的宽度是500
洗衣机的高度是800
'''
在python中,__xx__()
的函数叫做魔法方法,指的是具有特殊功能的函数。
__init__()
__init__()
思考:洗衣机的宽度是与生俱来的属性,可不可以在生产过程中就赋予这些属性呢?
答:理应如此。
__init__
方法的作用:初始化对象。
# 需求: 定义inti魔法方法设置初始化属性,并访问调用
'''
1. 定义类
inti 魔法方法: width 和 height
添加实例方法:访问实例属性
2. 创建对象
3. 验证结果
调用实例方法
'''
class Washer():
def __init__(self) -> None:
# 添加实例属性
self.width = 500
self.height = 800
def print_info(self):
print(f'洗衣机的宽度是{self.width}')
print(f'洗衣机的高度是{self.height}')
haier = Washer()
haier.print_info()
'''
洗衣机的宽度是500
洗衣机的高度是800
'''
注意:
__init__
在这里插入代码片()
方法,在创建一个对象时默认被调用,不需要手动调用__init__(self)
中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去。
__init__
思考:一个类可以创建多个对象,如何对不同的对象设置不同的初始化属性呢?
答:传参数。
# 1. 定义类:带参数的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}')
# 2. 创建对象,创建多个对象属性值不同:调用实例方法
haier1 = Washer(10,20)
haier1.print_info()
'''
洗衣机的宽度是10
洗衣机的高度是20
'''
haier2 = Washer(40,50)
haier2.print_info()
'''
洗衣机的宽度是40
洗衣机的高度是50
'''
注意:如果不传参会报错
TypeError: Washer.__init__() missing 2 required positional arguments: 'width' and 'height'
__str__()
当使用print输出对象的时候,默认打印对象的内存地址。如果类定义了__str__()
方法,那么就会答应存在这个方法中return的数据
# 1. 定义类
class Washer():
def __init__(self) :
# 添加实例属性
self.width = 300
self.height = 800
def __str__(self):
return '这是洗衣机的说明书'
# 2. 创建对象,创建多个对象属性值不同:调用实例方法
haier1 = Washer()
print(haier1) # 这是洗衣机的说明书
__del__()
当删除对象时,python解释器也会默认调用__del__()
方法。
# 1. 定义类
class Washer():
def __init__(self) :
# 添加实例属性
self.width = 300
self.height = 800
def __del__(self):
print('对象已经删除')
haier = Washer() # 对象已经删除