面向对象-封装
一、了解面向对象
面向对象是一种抽象化的程序设计思想,很多其它支持面向对象程序设计。
比如:洗衣服
手洗:相当于面向过程,人们需要设计并参与到整个洗衣服的过程中,必须按洗衣服的步骤来进行。
机洗:相当于面向对象,买了一台洗衣机,将洗衣服的某些步骤进行封装,用户只需要关注洗衣机的功能,需要哪些功能直接调用即可,不需要关注洗衣机的内部构造。
面向对象程序设计是一种使用代码对事物进行编程化的程序设计过程。
在代码中对事物的特征和行为进行程序设计,在调用时可以使用相应的属性和方法来实现事物的特征和行为。
二、类和对象
洗衣机的图纸相当于类;
每台洗衣机实体相当于对象。
面向对象程序设计中,包含两个概念:类和对象
对象是通过类的实例化来构建;(实例化相当于制造一台洗衣机的过程)
类只有一个,类的实例对象可以有多个。
2.1 类和对象的概念
2.1.1 类 --> 类对象
类是具有同一特性和行为的事物的统称。是一个个抽象的概念,类只有一个
类中的要素:
- 属性:相当于事物的特征
- 方法:相当于事物的行为
类的实例化,将类实例化为一个对象的过程。
2.1.2 对象 -->实例对象
对象是类的实例化,对象也叫实例对象。
对象可以有多个,可以对对象的属性进行修改和访问。
2.2 类和对象的实现
2.2.1 类的创建
类的命名规则,必须标积符命名规则。
类名必须使用大驼峰命名规则,类名不要使用下划线。比如:
MyWasherMachine
属性名与变量规则一致,方法名与函数名规则一致。比如:
get_wash
在Python中,类分为两种:经典类和新式类
- 经典类:没有父类
class 类名:
代码
...
- 新式类:必须继承
object
基类,如果不写object
,则默认继承object
class 类名(object):
代码
...
- 代码:定义一个洗衣机类
# 定义洗衣机类,相当于设计图纸
class MyWasher(object): # 定义类
def wash(self): # 定义实例方法
print('洗衣机可以洗衣服!')
2.2.2 对象的实例化
- 语法
# 变量名 = 类名()
- 代码
class MyWasher(object): # 定义类
def wash(self): # 定义实例方法
print('洗衣机可以洗衣服!')
# 实例化第一个对象
haier1 = MyWasher() # 创建好了一个实例对象
print(id(haier1), type(haier1)) # 2594358592512 <class '__main__.MyWasher'>
# 调用实例方法wash
haier1.wash() # 洗衣机可以洗衣服!
# 实例化第二个对象
haier2 = MyWasher()
print(id(haier2), type(haier2)) # 2594362902992 <class '__main__.MyWasher'>
# 调用实例方法wash
haier2.wash() # 洗衣机可以洗衣服!
# 打印类的内存地址
print(id(MyWasher), type(MyWasher)) # 2594355960400 <class 'type'>
对象是类的实例
对象的创建过程,叫做类的实例化
2.2.3 self
self
是实例对象的引用,可以用来操作所有属性
和方法
class MyWasher(object): # 定义类
def wash(self): # 定义实例方法
print('洗衣机可以洗衣服!')
print(f'self的ID为{id(self)}')
# 实例化对象
haier1 = MyWasher()
print(f'haier1的ID为{id(haier1)}') # haier1的ID为1579656495216
# 调用wash实例方法
haier1.wash() # self的ID为1579656495216
# 使用类对象调用实例方法wash
MyWasher.wash(haier1) # self的ID为1579656495216
实例方法必须先有实例对象,才能调用!
三、添加和获取实例属性
3.1 在类外部添加实例属性
- 语法
# 实例对象.实例属性名 = 值
- 代码
class MyWasher(object): # 定义类
def wash(self): # 定义实例方法
print('洗衣机可以洗衣服!')
# 实例化对象
haier1 = MyWasher()
# 添加实例属性
haier1.hight = 120
haier1.weight = 50.2
# 查看实例对象的所有实例属性
print(haier1.__dict__) # {'hight': 120, 'weight': 50.2}
3.2 在类外部获取实例属性
- 语法
# 实例对象.实例属性
- 代码
class MyWasher(object): # 定义类
def wash(self): # 定义实例方法
print('洗衣机可以洗衣服!')
# 实例化对象
haier1 = MyWasher()
# 添加实例属性
haier1.hight = 120
haier1.weight = 50.2
# 获取实例属性
print(haier1.hight)
print(haier1.weight)
3.3 在类内部获取实例属性
- 语法
# self.实例属性
- 代码
class MyWasher(object): # 定义类
def wash(self): # 定义实例方法
print('洗衣机可以洗衣服!')
# 获取实例属性的方法
def get_attribute(self):
print(f'洗衣机的高为{self.hight},重量为{self.weight}')
# 实例化一个对象
haier1 = MyWasher()
# 添加实例属性
haier1.hight = 120
haier1.weight = 50.2
# 调用get_attribute方法
haier1.get_attribute()
四、魔法方法
魔法方法,一般形式为__方法名__(self)
的方法就是魔法方法,调用者不需要直接调用,它们有对应调用特性。
__init__
:初始化方法,当实例化时,自动调用这个方法,进行实例属性的创建。初始化方法一般写在类的第一个方法。
- 无参数的初始化方法
class MyWasher(object):
def __init__(self): # 定义了一个初始化方法
self.hight = 120
self.weight = 50.2
# 实例化对象
haier1 = MyWasher()
print('---实例化之后---')
# 实例属性__class__用来标记对象的类
print(haier1.__class__) # <class '__main__.MyWasher'>
# 获取属性
print(haier1.hight, haier1.weight)
实例属性保存在实例空间中,其它的属性和方法保存在类空间。
- 有参数的初始化方法
class MyWasher(object):
def __init__(self, hight, weight): # 定义了一个初始化方法
self.hight = hight
self.weight = weight
# 实例化第一个对象
haier1 = MyWasher(120, 50.2) # 自动将参数传入到__init__中
print(id(haier1))
print(haier1.hight)
print(haier1.weight)
# 实例化第二个对象
haier2 = MyWasher(100, 56.2)
print(id(haier2))
print(haier2.hight)
print(haier2.weight)
__str__
:当打印实例对象的引用时,会直接执行这个方法,并将它的返回值返回给调用者
# 创建洗衣机类,有说明书
class MyWasher(object):
def wash(self):
print('洗衣服的功能')
# 定义一个说明书的方法
def __str__(self):
return '这个是洗衣机的说明书'
# 实例化对象
haier1 = MyWasher()
# 读取说明书
print(haier1)
__del__
:析构方法。当实例对象的空间释放,相当于将对象删除。
class MyWasher(object):
def __init__(self):
print('这个是初始化方法')
def __del__(self):
print('这个是析构方法')
# 实例化对象
haier1 = MyWasher()
del
一般
__del__
方法用在释放数据库的链接、TCP套接字的链接、HTTP会话链接…