面向对象最重要的概念就是类(Class)和
实例(Instance)
类:用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的 属性 和 方法(也叫动态属性)。对象是类的实例。
对象:通过类定义的数据结构实例。
实例化:创建一个类的实例,类的具体对象。
# 类定义
class people():
# 定义构造方法
def __init__(self, n, a, w):
self.name = n
self.age = a
self.weight = w
def speak(self):
print("%s 说: 我 %d 岁。" % (self.name, self.age))
# 实例化类
p = people('runoob', 10, 30)
p.speak()
首先定义一个人类,人具有的属性有,名字,年龄,体重,而且人具有说话的功能,这里将这个功能叫做方法,在具体点,就是people类中定义的函数。
注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。当然此处也可以不写self,写别的也行没只不过默认都用self,比如写roob也可以。除了构造函数init的第一个参数是self,其他类内部的函数的第一个参数必须也是self。参考下方代码。
__init__方法呢又叫做初始化方法,__init__也叫做构造函数,它的作用如上面代码所示,它可以将name,age,weight这些属性“绑”在这个“人”类上面。但是为什么没有调用init()就实现初始化方法的功能呢,这里要说明初始化方法会在类的实例化时python内部会自动调用。
注意:特殊方法__init__前后分别有两个下划线!!!
至于为什么要定义初始化方法,先举俩个例子、
class People():
def run(self,name,age,weight):
return "我的名字叫%s,我今年%d岁,我有%d千克,而且我打球很好。" % (name,age,weight)
person = People()
print(person.run("凌薇",18,60))
# 结果:我的名字叫凌薇,我今年18岁,我有60千克,而且我打球很好。
class People():
def __init__(self,name,age,weight):
self.name = name
self.age = age
self.weight = weight
# 此处就相当于将这三个属性绑在了people类上
def run(self):
return "我的名字叫做%s,我今年%d岁,我有%d千克,而且我打球很好。" % (self.name,self.age,self.weight)
person = People("凌薇",18,60)
print(person.run())
# 结果:我的名字叫做凌薇,我今年18岁,我有60千克,而且我打球很好。
简单理解:
通过以上俩个例子的对比,我们发现,定义完init()后,创建的每个实例都有自己的属性,也方便直接调用类中的函数。就相当于,你创建了一个人,而且这个人它自己给自己起了名字,他自己知道自己的年龄和体重,他是个真正的人类,这就是init()的作用。如果没有定义init(),就相当于这个人,他是个“AI机器人”,他不知道自己的名字,年龄,体重,需要你来告诉他。
够不够形象呢!!!