初识python中的类与对象
类的概念与定义
在生活中,我们走在路边,看到一辆车,大脑中首先想到的是“这是一辆车,
然后才是这是一辆什么牌子的车”,在这里,我们就用到了编程中的类的概念。
同样的,看到一条小狗,也会先想到这是一条狗,然后会想到这是一条什么品种的狗。
在编程中,把同一类的事物叫做类,把这个类里所共有的特征总结归纳并定义出来,就是类的属性;
把这个类能会做什么事,能做什么事总结归纳并定义出来就是类的技能。
举个例子:
我想定义一个人的类,在python里面要怎么实现呢,
首先,我们会想到人都有什么共同的特征呢?人都有两只眼睛,都有两条腿,等等这些是每个人都有的自己的特征,
其次,每个人还都拥有自己的独有特征,每个人的姓名都不是一样的,每个人还都有自己的年龄,自己的性别,自己的学历等等这些是每个人的独有特征
最后,人都有的技能还包括吃饭,睡觉,行走,学习等,这些是人都具有的技能
那个现在我们这可以定义人的类,具体实现代码如下:
class Person:
"""class是定义类的关键字,class后面的P erson是类的名字,python解释器会把class这个关键字后面的名称设定为类的名字,类的名字默认首字母大写。"""
#定义每个人都有两个眼睛
eye=2
#定义每个人都有两条腿
leg=2
def __init__(self,name,age,sex,education):
"""定义每个人的独有的特征,此处定义每个人都有自己的姓名,年龄,性别和学历"""
self.name=name
self.age=age
self.sex=sex
self.education=education
def eat(self):
#定义人都有的吃饭的技能
print("%s is eating food"%self.name)
def walk(self):
#定义人都有的行走的技能
print("%s is walking slow"%self.name)
def study(self):
#定义人都有的学习的技能
print("%s is studying hard"%self.name)
执行上面的代码,python解释器会在内存中开辟出一块内存空间,用来保存类中定义的人类的特征和技能
在上面的代码里,定义人类共有的特征时,相当于在人这个类的名称空间中定义了两个变量,定义人独有的特征时,相
当于是在人类的名称空间里,声明了一个名叫“初始化”的函数,在函数中存放代表了每个人独有的特征的变量
而接下来的三个函数则用来表示每个人都会做的动作,python解释器同样会为这三个函数在存放人类的名称空间的内存中开辟三块区域用来存放这三个函数(也可以称之为人类共有的技能
对象的概念与定义
在编程的世界里,定义出一个类之后,我们就可以用这个类生成一个个的人,这个过程我们也称之为类的实例化,生成之后的人我们则称之为对象。
现在我想用上面的程序实例化出两个人,要怎样实现呢??
person1=Person("jack",22,"male","college")
person2=Person("lily",18,"female","middle school")
这样我们就实例化出两个人:
第一个人名字叫jack,22岁,性别为男,大学学历,
第二个个名字叫lily,18岁,性别为女,中学学历。
对象的使用
现在我们已经创建出了两个人,现在可以调用这两个人的特征和技能了
比如,我想知道person1的特征,可以使用如下方法:
print(person1.name) #查看person1的名字,输出为:jack
print(person1.age) #查看person1的年龄,输出为:22
print(person1.sex) #查看person1的性别,输出为:male
print(person1.education) #查看person1的学历,输出为:college
查看person1的技能时:
person1.walk() #调用person1的行走的技能
会打印:jack is walking slow
person1.eat() #调用person1的吃饭的技能
会打印:jack is eating food
person1.study() #调用person1的学习的技能
会打印:jack is studying hard
查看person2的特征和技能时使用同样的方法
类与对象的对比分析
print(Person.eat,person1.eat,person2.eat)
执行结果如下:
<function Person.eat at 0x0000000002951BF8>
<bound method Person.eat of <__main__.Person object at 0x000000000295D240>
<bound method Person.eat of <__main__.Person object at 0x000000000295D278>>
分别调用类的吃饭的方法,以及person1和person2的吃饭的方法,可以看到它们的内存地址都不一样,同样的,调用他们的
其他的走路和学习的方法,它们各自的内存空间也都不一样,这充分说明了它们在内存中是各自开辟了一段自己的独有的内存空间。