一、类与对象的概念
类即是类别、种类的意思,是面向对象最重要的概念,在上一篇文章里我已经论述了,对象就是特征和技能的结合体,而类是一系列对象相似的特征与技能的结合体。现实世界中,是先有对象才有类的,而在我们面向对象编程的过程中却是不同的,我们必须先定义类,才能用类去产生(实例化)对象,这一点是最主要的区别。
二、定义类
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、有时为了编程需要,我们需要定义一些生活中并不存在的类。