复习回顾
我们上一期了对面向对象编程有了基本的认识。
我们去分析事物时,会不断去拆解,直到找到事物的本质。
同理,面向对象思想也这样的,把一个复杂的任务,去分类拆解不同模块,然后再使用面向过程去实现每个模块的具体功能。
通过面向对象的思维,我们有了类和对象的概念。
类是对象的模板,对象是类的具体实物
本期,我们来学习类的实物对象,也叫实例。
1.实例属性
1.1 实例属性简介
实例属性是从属于实例对象的属性,也称为实例变量。
-
实例属性一般放在init()方法里
self.实例属性名 = 初始值
-
在类的其他实例方法中,通过self进行访问
self.实例属性名
-
创建实例对象后,通过实例对象访问
Obj1 = 类名() #创建对象 obj1.实例属性名 = 值 # 赋予新对象的属性(特征)
1.2 实例属性内存分析
我们仍然拿Animal类来当案例,进行分析。
class Animal:
def __init__(self,name,food): # Animal的属性特征
self.name = name
self.food = food
def like_food(self): # Animal行为
print(self.name,'的最喜欢的食物是',self.food)
#创建猫实例
cat = Animal("Tom","fish")
cat.voice = "miaomiao" # 创建cat新属性voice
cat.where = "China" # 创建cat新属性where
cat.like_food()
- 首先会在堆内存中创建类对象Animal
- Animal("Tom","fish")会调用类的构造方法在堆内存中创建属性对象,并赋给栈内存中变量cat
- 为cat实例添加新的属性voice和where,则通过cat来添加到属性对象里
总结:实例属性是从属于实例对象,创建的对象添加的新的属性是不会影响另外的对象属性特点。
2. 实例方法
2.1 实例方法介绍
实例方法是从属实例对象的方法,只对对象进行调用
实例方法在类的范围里进行定义,格式如下:
def 方法名(self,[形参列表]):
函数体
方法的调用格式如下:
对象.方法名(实参列表)
注意:
- 定义实例方法时,第一个参数必须是self,self指当前对象
- 调用实例方法时,不能给self传参,self是由解释器进行自动传参的
函数与实例方法的区别
- 都是用来完成一个功能的语句块,本质一样
- 方法调用时,通过对象来调用,方法从属于特定实例对象,普通函数没有这个特点
- 方法定义时需要传递self,函数是不需要的
2. 实例方法内存分析
接着我们刚刚知道了实例属性,哪我们接着Animal类进行学习实例方法内存操作
class Animal:
def __init__(self,name,food): # Animal的属性特征
self.name = name
self.food = food
def like_food(self): # Animal行为
print(self.name,'的最喜欢的食物是',self.food)
#创建猫实例
dog = Animal("Bob","meat")
dog.like_food(dog)
- 在堆内存中创建Animal类(模具),并且类里面有一个lie_food方法
- Animal("Bob","meat")创建dog对象,里面包含dog属性以及like_food方法
3.dog.likefood()是dog属性里面的方法like_food调用类里面的like_food的方法时需要传入self(self是对象的地址)
- 因此,dog.like_food()与Animal.likefood(dog)运行效果一样的
总结
本次只要学习的类的实例对象,对实例属性和实例方法的底层逻辑有了清晰的认识和掌握。
接下来,我们将学习面向对象类相关的底层原理~
好啦,以上是本期内容,欢迎大佬评论区指正,下期见~