一、实验内容
题目1:类别统计
设计一个函数def func(*args), 用来统计当前文件中方法、函数、Animal类对象的个数(用中文和阿拉伯数字输出最后结果)。
import inspect
class Animal:
def __init__(self, name):
self.name = name
def em(self):
pass
def func(*args):
functions = 0
methods = 0
animals = 0
for item in args:
if inspect.isfunction(item):
functions += 1
elif inspect.ismethod(item):
methods += 1
elif isinstance(item, Animal):
animals += 1
print('函数数量为:', functions)
print('方法数量为:', methods)
print('Animal类数量为:', animals)
def example1(s):
print(s)
pass
cat = Animal('猫')
dog = Animal('狗')
func(cat, dog.em, example1)
题目2:类的创建
(1)创建一个Person类,在构造函数中初始化姓名name、年龄age属性,创建有返回值的get_name方法获取人的姓名,有返回值的get_age函数获取人的年龄;
(2)创建Student类继承Person类的属性和方法,在构造函数中调用基类的构造函数初始化共有的name、age属性,并将Student类独有的成绩属性course(包括语文、数学、英语三门成绩)进行初始化。创建有返回值的get_MaxScore方法用来返回3门科目中的最高分数。使用实例s1 = Student(‘小明’,18,[93,68,76])对Student类的三种方法进行测试,并输出结果,将结果截图。
class Person:
def __init__(self, name, age):
self.name = '张三'
self.age = 18
def get_name(self):
return self.name
def get_age(self):
return self.age
class Student(Person):
def __init__(self, name, age, course):
super().__init__(name, age)
self.course = course
def get_MaxScore(self):
return max(self.course)
def __str__(self):
return str(self.name) + ' ' + str(self.age) + ' ' + str(self.course)
s1 = Student('小明', 18, [93, 68, 76])
print(s1)
print('姓名:',s1.get_name())
print('年龄:',s1.get_age())
print('最高分数:', s1.get_MaxScore())
题目3:创建子类
如下现有一个保险政策类InsurancePolicy。
class InsurancePolicy:
def __init__(self, price_of_item):
self.price_of_insured_item = price_of_item
1)创建子类:交通险VehicleInsurance,构造方法中通过super将保额存储到实例变量中,同时用实例变量vehicle_Name存储交通工具的名字。创建一个实例方法get_rate(),返回回报率:保额*0.001
2)创建子类:家庭险HomeInsurance。构造方法中通过super将保额存储到实例变量中,同时用实例变量member_number存储家庭成员的人数。创建一个实例方法get_rate(),返回回报率:保额*0.00005
class InsurancePolicy:
def __init__(self, price_of_item):
self.price_of_insured_item = price_of_item
class VehicleInsurance(InsurancePolicy):
def __init__(self, price_of_item, vehicle_Name):
super().__init__(price_of_item)
self.vehicle_Name = vehicle_Name
def get_rate(self):
rate = self.price_of_insured_item * 0.001
return rate
class HomeInsurance(InsurancePolicy):
def __init__(self, price_of_item, member_number):
super().__init__(price_of_item)
self.member_number = member_number
def get_rate(self):
rate = self.price_of_insured_item * 0.0005
return rate
v=VehicleInsurance(5000,'小汽车')
print('交通险回报率:',v.get_rate())
h=HomeInsurance(1000000,4)
print('家庭险回报率:',h.get_rate())
题目4:添加实例方法
1)定义学生类Student,构造方法的两个参数name和year,将它们保存为实例变量。
创建一个对象:Jerry,5年级。
2)定义成绩类Grade,并定义及格线属性:passing为60。
添加构造方法,通过参数传值给实例变量score。
3)Student类的构造方法中,声明一个空的成绩列表grades。
在Student中添加一个方法add_grade(Grade),该方法需要首先验证传入的参数类型是否为Grade,正确的话可以添加到成绩列表中,否则不执行添加操作。
4)创建5个Grade对象,成绩分别为100,90,85,88,70分,并将它们到Jerry的成绩列表里。
5)Grade中添加is_passing方法,返回该成绩是否及格。
6)Student中添加一个返回该生的平均成绩的方法get_average().
7)判断Jerry是否有不及格成绩。
8)输出Jerry的平均成绩。
import statistics
class Grade:
passing = 60
def __init__(self, score):
self.score = score
def is_passing(self):
return self.score >= Grade.passing
class Student:
def __init__(self, name, year):
self.name = name
self.year = year
self.grades=[]
def add_grade(self, grade):
if isinstance(grade, Grade):
self.grades.append(grade)
def get_average(self):
if not self.grades:
return 0
total_score=sum(grade.score for grade in self.grades)
return total_score/len(self.grades)
g1 = Grade(100)
g2 = Grade(90)
g3 = Grade(85)
g4 = Grade(88)
g5 = Grade(70)
jerry = Student('Jerry', '5年级')
jerry.add_grade(g1)
jerry.add_grade(g2)
jerry.add_grade(g3)
jerry.add_grade(g4)
jerry.add_grade(g5)
has_failing_grade=any(not grade.is_passing() for grade in jerry.grades)
average_score=jerry.get_average()
print('Jerry是否有不及格成绩:',has_failing_grade)
print('Jerry的平均成绩:',average_score)
二、实验总结
1.在Python中,术语“方法”和“函数”通常用于描述可调用的代码块,但它们在使用和上下文中有一些区别。
函数(Function):
函数是一段可重复使用的代码块,可以通过函数名调用。
函数可以是内建函数(例如len(),print()等),也可以是用户自定义的函数。
函数可以被独立定义和调用,不依赖于任何对象。
函数定义形式如下:
def my_function(arg1, arg2):
# 函数体
return result
方法(Method):
方法是与对象关联的函数,通过对象的属性来调用。
在Python中,几乎所有东西都是对象,包括数字、字符串、列表、类实例等。
方法与函数类似,但是它是对象的一部分,通过对象的引用调用。
方法的调用形式如下:
object.method(arg1, arg2)
2.inspect 模块是 Python 的一个内建模块,它提供了一系列用于收集对象信息的工具。这些对象可能包括模块、类、实例、函数等。inspect 模块的功能可以用于获取源代码、获取函数或方法的参数信息、检查对象的类型以及获取堆栈信息等。
3.由于 passing 是一个类变量,你需要通过 Grade.passing 来引用它,而不是直接使用 passing。