- 类和对象深认识
- 1.实例对象
- 2.对象内存图
- 3.练习
- 4.类成员
- 5.类方法
- 6.练习
类和对象深认识 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 = 98
print(list01[0].name,list01[0].score)
# 小赵 98
list01[0].print_stu_info()
list01[1].print_stu_info()
#姓名是:小赵,年龄:28,成绩:98,性别:女
# 姓名是:苏大强,年龄:68,成绩:62,性别:男
内存图:
练习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 None
stu = find01()
print(stu.name,stu.age)
#苏大强 68
练习2:定义函数,在list01中查找所有女同学,将名称与性别打印在控制台中。
def find02():
result = []
for item in list01:
if item.sex == "女":
result.append(item)
return result
re = 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 count
print(find03())
# 3
练习4:定义函数,将list01中所有学生的成绩归零。
def set01():
for item in list01:
item.score = 0
set01()
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 result
re = 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_age
re = 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 -= money
i01 = ICBC("广渠门支行",100000)
i02 = ICBC("陶然亭支行",100000)
print("总行还剩%d钱"%ICBC.total_money)
#总行还剩800000钱
内存图:
语法
定义:
@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 -= money
i01 = ICBC("广渠门支行",100000)
i02 = ICBC("陶然亭支行",100000)
print("总行还剩%d钱"%ICBC.total_money)
#通过类名访问类方法﹐会将类名传入类方法。
ICBC.print_total_money()
运行结果为:
总行还剩800000钱
总行还剩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 +=1
stu01 = Student("张三",22,"男")
stu02 = Student("李四",25,"女")
stu03 = Student("莉莉",29,"女")
# print(Student.count)#3
Student.print_count()#3



