我们给出例子说明这一过程。试想,我们人其实就是一个类,是一个特定的人的模板。我们特定的个体人就是这个类下的一个具体的对象。这个对象是经过对该类进行实例化得到的结果,换句话说,这个过程就是对类这个模板增添一系列不同的方法 ( 行为 ) 从而得到不同的对象 ( 特定的个体人 ) 。
我们定义一个关于人的类,如下:
class People():
def __init__(self,id,name,age):
self.id = id
self.name = name
self.age = age
def walk(self):
print(f"{self.name}爱走路!")
def run(self):
print(f"{self.name}爱跑步!")
def sing(self):
print(f"{self.name}爱唱歌!")
首先定义人这个类( class People() );人有身份信息、有姓名、有年龄,这是人的特征,或者也可以被称作属性( __init__( )方法就是用来初始化这些特征的 );人还有自己的行为,比如说人可以走路( def walk() ),或者跑步( def run() ),亦或者唱歌( def sing() )。
接下来,我们构造两个人(对象),其中一个名叫张三,年龄为18岁,其身份证号为:610XXXX05;另一个名叫李四,年龄为20岁,其身份证号为:610XXXX01。构造的张三、李四这两个人,就是类People( )的实例对象。如下:
zhangsan = People("610XXXX05","张三",18)
lisi = People("610XXXX01","李四",20)
张三、李四这两个人都有三个特征(属性),他们都有身份证号码、姓名、年龄,换句话说,这三个特征(属性)只要是个人他都会有,只是不同的身份证号码、姓名、年龄塑造了不同的人个体。
print("张三的基本信息如下:","姓名:",zhangsan.name,
"身份证号码:",zhangsan.id,"年龄:",zhangsan.age)
print("李四的基本信息如下:","姓名:",lisi.name,
"身份证号码:",lisi.id,"年龄:",lisi.age)
打印出运行结果为:
张三的基本信息如下: 姓名: 张三 身份证号码: 610XXXX05 年龄: 18
李四的基本信息如下: 姓名: 李四 身份证号码: 610XXXX01 年龄: 20
我们给不同的人个体增添上他们自己的行为。比如说,张三喜欢走路,而李四喜欢跑步。那么我们给张三添加上走路这个行为,给李四添加上跑步这个行为。如下:
zhangsan.walk() # 给张三这个个体添加上走路行为
lisi.run()# 给李四这个个体添加上跑步行为
运行结果为:
张三爱走路!
李四爱跑步!
我们来验证一下张三和李四这两个人(对象)是否真有其各自的行为。
print(zhangsan.walk)
print(lisi.run)
# >
# >
得到结果发现,zhangsan绑定了People()类中的walk方法,lisi绑定了People()类中的run方法。
接下来,我们研究一下类中参数self的含义
首先是 python的魔法方法:def __init__(self):
这个self指的是类实例化的任意一个对象,只要你实例化一个特定的人(对象),这个方法就给这个特定的人加上身份证号、姓名、年龄(注意:此处还没有具体的身份证号码、具体的姓名内容、具体的年龄,只是有这三个标签),就像工厂里的流水线一样。 (self:可表示类实例化后任意的一个对象)。
其次是方法中的参数self,即def walk(self)、def run(self)、def sing(self)中的参数self:
self即类的任意一个实例化对象,谁在用某个方法,self指的就是它。比如说张三在用walk这个方法,那么def walk(self) 中的self指的就是张三。换句话说,self可以指人这个类实例化后的任意一个对象,它不是固定的,在给对象加上某个行为(方法)时,那么这个方法的self 表示的就是这个对象。
我们来通过一个实验更直观的分析方法中的self。如下:
class People():
def __init__(self,id,name,age):
self.id = id
self.name = name
self.age = age
def walk(self):
print(f"{self.name}爱走路!")
def run(self):
print(f"{self.name}爱跑步!")
def sing(self):
print(f"{self.name}爱唱歌!")
zhangsan = People("610XXXX05","张三",18)
zhangsan.walk() # 给张三这个个体添加上走路行为
# 运行结果为:张三爱走路!
# 张三 替换了{self.name},self参数指代实例对象本身。
因此,类经过实例化后,self就指实例对象。
我们再通过一个小实验来分析方法中的self参数。如下:
class People():
def __init__(self,id,name,age):
self.id = id
self.name = name
self.age = age
def walk(self):
print(f"{self.name}爱走路!")
def run(self):
print(f"{self.name}爱跑步!")
def sing(self):
if self == zhangsan:
self.run()
zhangsan = People("610XXXX05","张三",18)
lisi = People("610XXXX01","李四",20)
zhangsan.sing() # 此时,self指的是zhangsan这个实例化对象,所以可以执行if判断语句
lisi.sing() # 此时self指的是lisi这个实例化对象,不符合if条件,不能执行
# 运行结果为:张三爱跑步!
加上了 if 判断语句,最后,张三就有了爱跑步的行为,而李四却没有这个行为。因此,就有,当某个实例对象调用类中的方法时,实例对象借助self去调用类方法。该对象会把自身作为第一个参数自动传给该方法,而这第一个参数就是self。
注意:__init__(self)中的self与其余方法中的self是一个self,当实例化一个对象后,这个对象指代__init__(self)中的self,当这个对象继续使用该类中其余的某个方法时,那么该方法中的self即为该对象。
参考自:
Python的类、类实例化 - 知乎Python类中的self是什么意思?_python类的self_m0_62346827的博客-CSDN博客