> 文档中心 > 【python面向对象】类和对象(二)

【python面向对象】类和对象(二)

文章目录

  • 类和对象深认识
    • 1.实例对象
    • 2.对象内存图
    • 3.练习
    • 4.类成员
    • 5.类方法
    • 6.练习

类和对象深认识

1.实例对象

语法

  • 定义:对象.变量名
  • 调用:对象.变量名
  • 每个对象存储一份,通过对象地址访问。

练习:参照之前的例子进行改写,要求如下:

  1. 创建学生类:
    –数据∶姓名,年龄,成绩﹐性别
    –行为∶在控制台中打印个人信息的方法
  2. 在控制台中循环录入学生信息,如果名称是空字符,退出录入。
  3. 在控制台中输出每个学生信息(调用打印学生类的打印方法)。
  4. 打印第一个学生信息。
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)但是不建议上面的做法,记住主流算法

总结不建议的写法:

  1. 在类外添加实例成员
  2. 通过类访问实例方法(特殊情况除外)
  3. 通过实例访问类成员

说明:

  • 至少有一个形参,第一个形参用于绑定类,一般命名为’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