@[toc]
1. 深入理解面向对象
面向对象就是将编程当作一个事物,它对外界来说是直接可以使用的,而不需要在意内部的构造情况。这里的编程是指为事物创建一列动作。
为了方便大家理解,以洗衣服这件事情为例。
⼿手洗:找盆 - 放⽔水 - 加洗⾐衣粉 - 浸泡 - 搓洗 - 拧⼲干⽔水 - 倒⽔水 - 漂洗N次 - 拧⼲干 - 晾晒。
机洗:打开洗⾐衣机 - 放⾐衣服 - 加洗⾐衣粉 - 按下开始按钮 - 晾晒。
对于现代人来说,手洗已经很少了,多数采用机洗的方式。因为我们可以跳过繁琐的过程,好比要把大象塞进冰箱中的思路一样——打开冰箱,放进大象,关闭冰箱。
==也就是说机洗使得洗衣服变得更加简单,而且高效!!!==
这也就衍生出为什么面向对象很重要 —— 面向对象的编程可以使得代码的整体逻辑更简洁清晰。
补充
Q: python 面向对象相较于Java, C++ 等更加彻底,为什么?
A: 因为我们所创建的一系列 list、str、dict、tuple等数据类型 都继承自 object,而 object 又继承自 type ,type又是自己的实例。简而言之:type 是起点,它制造了自己,然后制造了object这个对象,object对象和 type 产生了变量。
2. 类和对象的关系
请先记住这句话:类创建对象
同样,还是洗衣机的例子。
Q1: 你们家的洗衣机怎么来的?A1 : 商场买来的。
Q2 :商场中的洗衣机哪儿来的?A2: 工厂制造的。
Q3: 工厂为什么会造洗衣机?A3:因为有设计图纸。
到此,通过三个Q & A, 引出了洗衣机产生的依据——设计图纸。总结上面的过程就是:
设计图纸 ——> 洗衣机 ——> 洗衣服
而其实这里的制造洗衣机的设计图纸就可以比作面向对象中的类, 而制造出来的洗衣机就是对象。
也就是说类和对象的关系是 ==类创建对象==。而这里的创建一词其实也就是我们平常所说的实例化。
3. 理解类和对象
上一小节已经介绍了类和对象的关系,接下来深入理解类和对象
3.1 类
类的定义
类是对一系列具有相同特征和行为的事务的统称,是一个抽象的概念,不是真实存在的事物
同样以洗衣机为例
-
洗衣机的特征(如长宽高、颜色等)--> 类的属性(也就是类中的变量)
- 洗衣机的行为 (如是否要脱水,是否为速洗等) --> 类的方法(也就是类中的函数)
3.2 对象
对象的定义
对象是类创建出来的真实存在的事物
注意:
4.面向对象实现方法
4.1 定义一个类
如果对前面理解透彻的话,那么现在就可以开始洗衣机图纸的设计了。
python中类分为: 经典类 和 新式类
- 语法
注意: 类名要满足标识符命名规则,同时遵循==大驼峰命名法==
4.2 创建对象
对象又称是
- 语法
4.3 类之初体验
# 1. 定义洗衣机类 class Washer(): def wash(self): print("我是洗衣机") # 2. 创建对象/实例化对象 Haier = Washer() # 3. 验证成果 # 3.1 打印 haier对象 print(Haier) # 打印出了内存地址 <__main__.Washer object at 0x000001A8C23FAF40> # 3.2 使用wash功能 -- 实例方法/对象芳芳 --对项目.wahs() print(Haier.wash()) # 打印出了 "我是洗衣机"4.3 self 介绍
上面的代码中是不是出现了一个self, 其实self 指的是调用该函数的对象,在上列中可以理解为haier这个实例对象。
为什么可以这么说的,因为haier对象的地址和self地址是相同的,不信?见代码。
class Washer(): def wash(self): print(self) Haier = Washer() print(Haier) # <__main__.Washer object at 0x000001A8C23EBE80> Haier.wash() # <__main__.Washer object at 0x000001A8C23EBE80>可以看到二者打印的地址是相同的
结论:打印对象和打印self得到的内存地址相同,所以self指的是调用该函数的对象
4.4 一个类创建多个对象
我们知道,一张图纸是可以用来制造非常多的洗衣机的,当工厂拿到图纸以后就可以批量生产了。
同理,我们的类也一样,可以创建对个对象。
class Washer(): def wash(self): print(self) # 创建海尔洗衣机01号 Haier01 = Washer() Haier01.wash() # <__main__.Washer object at 0x000001A8C23EBE80> # 创建海尔洗衣机02号 Haier02 = Washer() Haier02.wash() # <__main__.Washer object at 0x000001A8C23EB310>可以看到,不同对象的地址是不一样的,而且打印出的 self 的地址也在改变(因为 self 永远指向调用该方法(函数)的对象)。
5. 添加和获取对象属性
前面已经提到:属性就是特征,比如洗衣机的宽度、高度、颜色等,而对象属性既可以在类外面获取,也能在类里面添加和获取
5.1 添加对象属性
如何理解添加对象属性呢?
> 当你买到洗衣机,既定的高度++- 、颜色等属性一方面由工人按照图纸制造出来;另一方面也可以按照自己的意愿进行涂色等修改(虽然大家不会那样做QAQ)。
5.1.1 类外面添加对象属性
- 语法
- 体验 Haier01.width = 500 # 修改宽度 Haier01.height = 800 # 修改高度
5.1.2 类外面获取对象属性
-
语法
对象名.属性名- 体验
5.2 获取对象属性
如何理解获取对象属性呢?
洗衣机的高度、颜色等特征信息既体现在图纸中,页可以自己测量所得
5.2.1 类里面获取对象属性
- 语法
- 体验
6. 魔法方法
所谓魔法方法,也称为魔法函数(Magic Methods),是Python的一种高级语法,允许你在类中自定义函数(函数名格式一般为xx),并绑定到类的特殊方法中。比如在类A中自定义str()函数,则在调用str(A())时,会自动调用str( ) 函数,并返回相应的结果。
一言以蔽之, xx 叫做魔法方法,指的是具有特殊功能的函数。
6.1 魔法方法一览
6.2 魔法方法初识
魔法方法其实就相当于洗衣机中与生俱来的属性,在生产过程中赋予了这些属性,类比于洗衣机说明书中介绍的各种模式。
6.2.1 init( )
init ( ) 方法的作用:初始化对象
class Washer(): # 定义 __init__, 添加实例属性 def __init__(self, width, color, height): # 添加实例属性 self.color = "white" self.width = width self.height = height def get_color(self): # 在类中调用实例属性 print(f"洗衣机颜色为:{self.color}") def get_shape(self): print(f"洗衣机的宽度为:{self.width}, 高度为:{self.height}") Haier01 = Washer() # 实例化一个洗衣机对象(不传参数) Haier01.get_color() # 洗衣机颜色为:white Haier02 = Washer(width=300, height=400) # 传入参数 Haier02.get_shape() # 洗衣机的宽度为:300, 洗衣机的宽度为:400注意:
-
init( )方法,在创建对象时默认自动调用
- init(self) 中的 self 参数,不需要开发者传递, python解释器会自动把当前对象引用传递过去
6.2.2 str( )
当print输出对象的时候,默认打印对象的内存地址。而如果类中定义了 str 方法,那么就会打印从这个方法中 return的数据。
举个栗子:
class Washer(): def __init__(self, width): self.width = width def __str__(self): return "产品使用说明书" Haier = Washer(400) print(Haier) # 产品使用说明书可以看到最终打印的结果并非 width属性,而是返回了 _str下的文字, str ( ) 方法中的文字多为类的介绍
6.2.3 del( )
当删除对象时候,python解释器默认调用 del( ) 方法
同样的,举个栗子:
class Washer(): def __init__(self, width): self.width = width def __del__(self): print(f"{self}这个对象已经删除!") Haier = Washer(400) del Haier # <__main__.Washer object at 0x000001A8C23EB5E0>这个对象已经删除!好啦,本次关于python中面向对象的知识就先介绍到这儿了,还会持续更新~