一、类与对象的概念
类即是类别、种类的意思,是面向对象最重要的概念,在上一篇文章里我已经论述了,对象就是特征和技能的结合体,而类是一系列对象相似的特征与技能的结合体。现实世界中,是先有对象才有类的,而在我们面向对象编程的过程中却是不同的,我们必须先定义类,才能用类去产生(实例化)对象,这一点是最主要的区别。
二、定义类
1、现实世界中,先有对象,再有类。
对象1 特征 职业:学生 姓名:王二 性别:男 年龄:22 技能 学习 打游戏 对象2 特征 职业:学生 姓名:张三 性别:男 年龄:20 技能 学习 打游戏 看书 对象3 特征 职业:学生 姓名:婉婉 性别:女 年龄:18 技能 学习 打游戏 看书 现实中的类: 特征: 职业:学生 技能: 学习 打游戏 看书
2、在面向对象编程的程序中,必须先定义类,才能实例化产生对象。
# 先有类
class School_learn: job = 'student'
def study(self): print('study hard!') def play_game(self): print('play games as little as you can') def read(self): print('read books more and more') # 再调用类产生对象
student1 = School_learn() # 通过类的实例化产生对象,等同于School_learn(student1),自动传参 student2 = School_learn() student3 = School_learn() print(student1) # <__main__.School_learn object at 0x000002B70F8D7588> 对象
print(student2) print(student3)
注意:<1>在Python程序中类用class关键字定义,类名首字母习惯一般大写,在程序中,特征用变量标识,技能用函数标识,所以在类中最常见的操作就是变量和函数的定义。
<2>类中定义的代码,在类定义阶段便会执行,因而会产生新的名称空间,用来存放类的变量名与函数名,可以通过School_learn.__dict__查看。
<3>类中定义的名字,都是类的属性,用 类名+“ .”+ 属性名可以访问属性。
<4>对于类,有两种分类,一种是经典类,另一个是新式类,经典类可以通过该字典操作类名称空间的名字,但新式类有限制,这个暂时我们不讨论,后面会再区分。
三、类的使用
1、查看类的名称空间和类属性的增删改查
#!/usr/bin/env python3 #-*- coding:utf-8 -*-
class School_student: job = 'student' # 数据属性
def student(self): print('student hard') def games(self): # 函数属性
print('playing game') def read(self): # 函数属性
print('read books') print('hello') # hello
# 查看类的名称空间
print(School_student.__dict__) print(School_student.__dict__['job']) # student
print(School_student.__dict__['games']) # <function School_student.games at 0x000001CA24978B70>
# 类的查看
print(School_student.job) # student
print(School_student.games) # <function School_student.games at 0x0000020072358B70>
# 类属性增加
School_student.county = 'China' # 默认添加到最后以键值对 'county': 'China'
print(School_student.__dict__) # 类属性的更改
School_student.job = 'STUDENT'
print(School_student.job) # STUDENT
# 类属性的删除
del School_student.county # 删除键值对 'county': 'China'
print(School_student.__dict__)
2、调用类,即实例化,得到对象
student1 = School_learn() student2= School_learn() student3 = School_learn()
3、__init__方法
class School_learn: job = 'student'
def __init__(self,name,age,sex): ''' # 添加对象独有的属性 # self:student1 :param name: '小明' :param age: 20 :param sex: '男' ''' self.Name = name # student1.Name = '小明'
self.Age = age # student1.Age = 20
self.Sex = sex # student1.Sex = '男'
# 再调用类产生对象
student1 = School_learn('小明',20,'男') # 实例化,此处相当于传了四个值:student1,'小明',20,'男'
print(student1.__dict__) # {'Name': '小明', 'Age': 20, 'Sex': '男'}
注意:<1> __init__方法是在对象产生之后才会执行,只用来为对象进行初始化操作,不能有返回值。
<2> 加上__init__方法后,实际的实例化过程分两步:
first:先产生一个空对象 student1,
second:触发School_learn.__init__()方法,传递参数 student1,'小明',20,‘男’
四、对象的使用
对象属性的增删改查
# 增
student1.Hobby = 'reading'
print(student1.__dict__) # {'Name': '小明', 'Age': 20, 'Sex': '男', 'Hobby': 'reading'}
# 删
del student1.Hobby print(student1.__dict__) # {'Name': '小明', 'Age': 20, 'Sex': '男'}
# 改
student1.Name = '小华'
print(student1.__dict__) # {'Name': '小华', 'Age': 20, 'Sex': '男'}
print(student1.Name) # 小华
# 查
print(student1.Sex) # 男
print(student1.__dict__) student2 = School_learn('小敏',19,'女') print(student2.__dict__) # {'Name': '小敏', 'Age': 19, 'Sex': '女'}
print(student2.Name) # 小敏
五、小结
1、站在不同的角度,我们所定义出的类是完全不同的,每个人的“上帝视角“各有所观,正如一千个人眼中有一千个哈姆莱特一般。
2、现实中的类与程序中的类并不完全等同,现实世界,先有类,再有对象;程序中,先有类,再有对象。
3、有时为了编程需要,我们需要定义一些生活中并不存在的类。