【python面向对象】类和对象(二)
文章目录
类和对象深认识
1.实例对象
语法
- 定义:对象.变量名
- 调用:对象.变量名
- 每个对象存储一份,通过对象地址访问。
练习:参照之前的例子进行改写,要求如下:
- 创建学生类:
–数据∶姓名,年龄,成绩﹐性别
–行为∶在控制台中打印个人信息的方法 - 在控制台中循环录入学生信息,如果名称是空字符,退出录入。
- 在控制台中输出每个学生信息(调用打印学生类的打印方法)。
- 打印第一个学生信息。
class Student: def __init__(self,name,age,score,sex): self.name = name self.age = age self.score = score self.sex = sex def print_stu_info(self): print("姓名是:%s,年龄:%s,成绩:%s,性别:%s"%(self.name,self.age,self.score,self.sex))list01_student_info = []while True: stu_name = input("请输入学生姓名:") if stu_name == "": break stu_age = input("请输入学生年龄:") stu_score = input("请输入学生成绩:") stu_sex = input("请输入学生性别:") stu = Student(stu_name,stu_age,stu_score,stu_sex) list01_student_info.append(stu) print(list01_student_info)for stu_info in list01_student_info: stu_info.print_stu_info()print("---------------------------------------")#获取第一个学生信息stu_num01_info = list01_student_info[0]stu_num01_info.print_stu_info()
2.对象内存图
""" 对象内存图"""class Student: def __init__(self,name,age,score,sex): # 创建实例变量 self.name = name self.age = age self.score = score self.sex = sex def print_stu_info(self): # 读取实例变量 print("姓名是:%s,年龄:%s,成绩:%s,性别:%s"%(self.name,self.age,self.score,self.sex))list01 = [ Student("赵敏",28,100,"女"), Student("苏大强", 68, 62, "男")]s01 =list01[0]s01.name ="小赵"s01.score = 98print(list01[0].name,list01[0].score)# 小赵 98list01[0].print_stu_info()list01[1].print_stu_info()#姓名是:小赵,年龄:28,成绩:98,性别:女# 姓名是:苏大强,年龄:68,成绩:62,性别:男
内存图:
3.练习
练习1:定义函数,在list01中查找name是"苏大强”的对象,将名称与年龄打印在控制台中。
class Student: def __init__(self,name,age,score,sex): # 创建实例变量 # 每个对象存储一份,通过对象地址访问。 self.name = name self.age = age self.score = score self.sex = sex def print_stu_info(self): # 读取实例变量 print("姓名是:%s,年龄:%s,成绩:%s,性别:%s"%(self.name,self.age,self.score,self.sex))list01 = [ Student("赵敏",28,100,"女"), Student("苏大强",68,62,"男"), Student("明玉",30,95,"女"), Student("无忌",29,70,"男"), Student("张三丰",30, 96,"男"),]def find01(): for item in list01: if item.name == "苏大强": return item # 如果没找到﹐则返回空。而函数返回值默认就是空,所以可以不写。 #return Nonestu = find01()print(stu.name,stu.age)#苏大强 68
练习2:定义函数,在list01中查找所有女同学,将名称与性别打印在控制台中。
def find02(): result = [] for item in list01: if item.sex == "女": result.append(item) return resultre = find02()for stu_info in re: print(stu_info.name,stu_info.age)# 赵敏 28# 明玉 30
练习3:定义函数,查找年龄>=30的学生数量。
def find03(): count = 0 for item in list01: if item.age >= 30: count += 1 return countprint(find03())# 3
练习4:定义函数,将list01中所有学生的成绩归零。
def set01(): for item in list01: item.score = 0set01()for stu_info in list01: print(stu_info.name,stu_info.score)# 赵敏 0# 苏大强 0# 明玉 0# 无忌 0# 张三丰 0
练习5:获取list01中所有学生的名字。
def get01(): result = [] for item in list01: result.append(item.name) return resultre = get01()print(re)# ['赵敏', '苏大强', '明玉', '无忌', '张三丰']
练习6:定义函数,在list01中查找年龄最大的学生对象。
def find04(): max_age = list01[0] for item in range(1,len(list01)): if list01[item].age >= max_age.age: max_age = list01[item] return max_agere = find04()re.print_stu_info()#姓名是:苏大强,年龄:68,成绩:62,性别:男
4.类成员
语法
- 定义:在类中,方法外定义变量。
class 类名: 变量名=表达式
- 调用:类名.变量名
- 不建议通过对象访问类变量
- 说明
–存储在类中。
–只有一份,被所有对象共享。 - 作用:描述所有对象的共有数据。
class ICBC: """ 工商银行 """ #表示总行的钱 total_money = 1000000 def __init__(self,name,money): self.name = name self.money = money # 表示从总行中扣除当前支行使用的金额 ICBC.total_money -= moneyi01 = ICBC("广渠门支行",100000)i02 = ICBC("陶然亭支行",100000)print("总行还剩%d钱"%ICBC.total_money)#总行还剩800000钱
内存图:
5.类方法
语法
定义:
@classmethod..def 方法名称(cls,参数列表):方法体
调用:
类名.方法名(参数列表)不建议通过对象访问类方法
注意:可以通过类名访问实例方法,但必须手动传递对象地址Student.print_self(s02)也可以通过对象地址访问类成员print(s01.count)但是不建议上面的做法,记住主流算法
总结不建议的写法:
- 在类外添加实例成员
- 通过类访问实例方法(特殊情况除外)
- 通过实例访问类成员
说明:
- 至少有一个形参,第一个形参用于绑定类,一般命名为’cls’
- 使用@classmethod修饰的目的是调用类方法时可以隐式传递类
- 类方法中不能访问实例成员,实例方法中可以访问类成员。
作用:操作类变量
class ICBC: """ 工商银行 """ #表示总行的钱 total_money = 1000000 # 因为类方法没有对象地址self,所以不能访问实例成员 @classmethod def print_total_money(cls): print(cls,ICBC) print("总行还剩%d钱"%ICBC.total_money) def __init__(self,name,money): self.name = name self.money = money # 表示从总行中扣除当前支行使用的金额 ICBC.total_money -= moneyi01 = ICBC("广渠门支行",100000)i02 = ICBC("陶然亭支行",100000)print("总行还剩%d钱"%ICBC.total_money)#通过类名访问类方法﹐会将类名传入类方法。ICBC.print_total_money()运行结果为:总行还剩800000钱<class '__main__.ICBC'> <class '__main__.ICBC'>总行还剩800000钱
6.练习
定义对象计数器,要求如下:
定义学生类,创建3个学生对象。可以通过类变量记录学生对象个数,可以通过类方法打印学生对象个数。
class Student(): count = 0 @classmethod def print_count(cls): print(cls.count) def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex Student.count +=1stu01 = Student("张三",22,"男")stu02 = Student("李四",25,"女")stu03 = Student("莉莉",29,"女")# print(Student.count)#3Student.print_count()#3