类和实例
- 描述
类是用来创建数据结构和新类型对象的主要机制。一个类定义了一系列与其实例对象密切关联的属性,典型的属性包括变量(实例化称为属性)和函数(实例化称为方法)
- 类的定义
定义类是通过class
关键字
class Student(object):
pass
class
后面Student
是类名,通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的。如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类
- 类实例化
定义好类,就可以根据类名创建出实例,创建实例是通过类名+()实现的
class Student(object):
pass
st = Student()
print(st)
# 输出结果:<__main__.Student object at 0x0000025A20B93F98>
print(Student)
# 输出结果:<class '__main__.Student'>
变量st
指向的就是一个Student
的实例,而Student
本身则是一个类
- 类属性绑定
可以自由地给一个实例变量绑定属性
class Student(object):
pass
st = Student()
st.name = 'spider man'
print(st.name)
# 输出结果:spider man
给实例st
绑定一个name
属性
由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填进去。通过定义一个特殊的__init__()方法(前后分别是两个下划线),在创建实例的时候,就把属性绑定上去
class Student(object):
def __init__(self, name, socre):
self.name = name
self.socre = score
__init__
方法的第一个参数永远是self
,表示创建的实例本身,因此在__init__
方法内部,可以把各种属性绑定到self
,因为self
就是指向创建的实例本身
有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入__init__方法匹配的参数,但self
不需要传,Python解释器自己会把实例变量传进去
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
st = Student('man', 30)
print(st.name, st.score)
# 输出结果:man 30
注:与普通函数相比,类定义的函数第一个参数永远是实例变量self
,并且,调用时不用传递该参数
- 数据封装
面向对象编程的一个重要特点就是数据封装
可以通过函数来访问这些数据,例打印学生的姓名和成绩
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
st = Student('good man', 80)
def print_student(参数):
print('{}:{}'.format(st.name, st.score))
print_student(st)
# 输出结果: good man:80
既然实例本身就拥有这些数据,要访问这些数据,可以直接在类的内部定义访问数据的函数。这些封装数据的函数是和student
类本身关联起来的,称之为类的方法
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_student(self):
print('{}:{}'.format(self.name, self.score))
st = Student('bad man', 30)
st.print_student()
# 输出结果:bad man:30
封装的另一个好处是给Student
类增加新的方法
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_student(self):
print('{}:{}:{}'.format(self.name,self.score))
def get_grade(self):
if self.score >= 90:
return 'a'
elif self.score >= 60:
return 'b'
else:
return 'c'
st1 = Student('man1', 100)
st2 = Student('man2', 59)
print(st1.name, st1.get_grade())
# 输出结果:man1 a
print(st2.name, st2.get_grade())
# 输出结果:man2 c
注:类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都相互独立,互不影响