一、实验目的与要求
1、了解面向对象编程思想,掌握类和对象的定义和使用。
2、熟悉self的使用技巧,掌握构造方法的使用。
3、了解如何使用封装保护属性,掌握单继承和多继承的使用。
4、掌握类属性和实例属性的使用,熟悉类方法和静态方法的使用技巧。
二、实验原理
在程序中使用对象来映射现实中的事物,使用对象间的关系来描述事物之间的联系,这种思想就是面向对象。面向对象编程有两个非常重要的概念:类和对象。对象是面向对象编程的核心。具有相似特征和行为的事物的集合统称为类,对象是根据类创建的,一个类可以对应多个对象。类是由3部分组成的:(1)类的名称:类名,首字母必须大写,比如Person;(2)类的属性:一组数据,比如性别;(3)类的方法:允许进行操作的方法,比如说话。使用class关键字来声明一个类,基本格式如下:
class 类名:
类的属性
类的方法
根据类创建对象的语法格式如下:
对象名 = 类名()
要想给对象添加属性,可以通过如下方式:
对象名.新的属性名 = 值
构造方法指的是__init__方法。当创建类的实例的时候,系统会自动调用构造方法,从而实现对类进行初始化的操作。当删除一个对象来释放类所占用资源的时候,Python解释器默认会调用另外一个方法,这个方法就是__del__( )方法。__del__方法被称为析构方法。
在方法的列表中,第1个参数永远都是self。self的字面意思是自己,我们可以把它当做C++里面的this指针理解,表示的是对象自身。当某个对象调用方法的时候,Python解释器会把这个对象作为第1个参数传给self,开发者只需要传递后面的参数就可以了。
运算符重载是通过实现特定的方法使类的实例对象支持Python的各种内置操作。例如:+运算符是类里提供的__add__这个函数,当调用+实现加法运算的时候,实际上是调用了__add__方法。加法运算是通过调用__add__方法完成重载的,当两个实例对象执行加法运算时,自动调用__add__方法。跟索引相关的重载方法包括如下3个:__getitem__:索引、分片;__setitem__:索引赋值;__delitem__:索引和分片删除。在对实例对象执行索引、分片或者for迭代操作时,会自动调用__getitem__方法;通过赋值语句给索引或者分片赋值时,调用__ setitem __方法实现对序列对象的修改;当调用del方法时,实质上会调用__delitem__方法实现删除操作。
为了保护类里面的属性,可以采用如下方式解决:1.把属性定义为私有属性,即在属性名的前面加上两个下划线;2.添加用于设置或获取属性值的两个方法供外界调用。此即为封装。在程序中,继承描述的是事物之间的所属关系。类的继承是指在一个现有类的基础上构建一个新的类,构建出来的新类被称作子类。Python程序中,继承使用如下语法格式标注:
class 子类名(父类名):
Python支持多继承,多继承就是子类拥有多个父类,并且具有它们共同的特征,即子类继承了父类的方法和属性。多继承可以看做是单继承的扩展,语法格式如下:
class 子类名(父类1,父类2…):
如果子类继承的多个父类间是平行的关系,子类先继承的哪个类就会调用哪个类的方法。在继承关系中,子类会自动拥有父类定义的方法,但是有时子类想要按照自己的方式实现方法,即对父类中继承来的方法进行重写,使得子类中的方法覆盖掉跟父类同名的方法。需要注意的是,在子类中重写的方法要和父类被重写的方法具有相同的方法名和参数列表。在Python中,多态指在不考虑对象类型的情况下使用对象,它不关注对象的类型,而是关注对象具有的行为。
类属性是类所拥有的属性,它需要在类中进行显示地定义(位于类内部,方法的外面),它被所有类的实例对象所共有,在内存中只存在一个副本。通过“实例.属性”添加属性的属性都是实例属性。
使用修饰器@classmethod来标识类方法。要想调用类方法,既可以通过对象名调用类方法,又可以通过类名调用类方法,这两种方法没有任何区别。
class 类名:
@classmethod
def 类方法名(cls):
方法体
使用修饰器@staticmethod来标识静态方法。
class 类名:
@staticmethod
def 静态方法名():
方法体
静态方法是没有self参数,在静态方法中无法访问实例变量;静态方法中不可以直接访问类属性,但是可以通过类名引用类属性;静态方法跟定义它的类没有直接关系,只是起到了类似函数的作用。
三、预习与准备
1、提前预习Python面向对象编程思想的基础语法知识,实验之前编写好程序代码。
2、练习关于Python面向对象编程的常见编程技巧。
实验题1 分析程序运行结果:阅读下面的程序,分析代码是否能够编译通过。如果能编译通过,请列出运行的结果,否则请说明编译失败的原因。
(1)代码一:
class Person:
def __init__(self,name):
self.name = name
def __str__(self):
return "我的名字是" + self.name
person = Person("小明")
print(person)
(2)代码二:
class Person:
def __del__(self):
print("—del--")
person = Person()
del person
print("—end--")
实验题2 设计一个课程类,包括课程编号、课程名称、任课教师、上课地点等属性,把上课地点变量设为私有的,增加构造方法和显示课程信息的方法。
源码:
class ClassInfo:
def __init__(self,classnumber,classname,teacher,adress):
self.classnumber=classnumber
self.classname=classname
self.teacher=teacher
self.__adress=adress
def __str__(self):
print("课程编号:%d\n课程名称:%s\n任课老师:%s\n" \
"上课地点:%s"%(self.classnumber,self.classname,self.teacher,self.__adress))
return "课程编号:%d\n课程名称:%s\n任课老师:%s\n" \
"上课地点:%s"%(self.classnumber,self.classname,self.teacher,self.__adress)
myclass=ClassInfo(1111,"Python程序设计","阿意","S2020")
实验题3 设计一个表示学生(Student)的类,该类的属性有姓名(name)、年龄(age)、成绩(scores)(成绩包括语文、数学和英语三科成绩,每科成绩的类型为整数),另外有3个方法。
(1)获取学生姓名的方法:get_name(),返回类型为String()。
(2)获取学生年龄的方法:get_age()方法,返回类型为int。
(3)返回3门科目中最高的分数:get_course(),返回类型为int。
源码:
class Student:
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def get_name(self):
return self.name
def get_age(self):
return int(self.age)
def get_course(self):
# print(self.score.values())
a = list(self.score.values())
# print(a)
return max(a)
student_01 = Student("张明明", 25, {'语文': 56, '数学': 100, '英语': 99})
# score = {'语文': 118, '数学': 88, '英语': 122}
# student_01 = Student("张明明", 25, [56, 100, 99])
# 高阶函数:sorted
print(student_01.get_name())
print(student_01.get_age())
print(student_01.get_course())
实验题4 设计一个表示动物(Animal)的类,该类包括颜色(color)属性和叫(call)方法。再设计一个表示鱼(Fish)的类,包括尾巴(tail)和颜色(color)两个属性,及叫(call)方法。
提示:让Fish类继承自Animal类,重写__init__()和call方法。
源码:
class Animal(object):
def __init__(self,color):
self.color=color def call(self): print("动物叫。。。") class Fish(Animal): def __init__(self,color): super().__init__(color) self.tail=True def call(self): print("%s的鱼在吐泡泡"%self.color) fish=Fish("蓝色") fish.call() animal=Animal("白色") animal.call()
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。