使用面向对象(学生管理系统v3.0)
学生类
管理系统类
魔法方法:
不手动调用,会自动执行的方法magic method
特点:双下划线开头,双下划线结尾
students_list = [] class Student: def __init__(self,name,score): self.name = name self.score = score #手动实现__str__()方法 def __str__(self): return 'name:%s score:%d' % (self.name, self.score) class SystemManger(object): def __init__(self,version,name,author): self.version = version self.name = name self.author = author def showMenu(self): print("欢迎光临%s %s"%(self.name,self.version)) print("1.添加学生") print("2.展示学生") print("3.退出系统") def addStudent(self,stu): students_list.append(stu) def showAllStudents(self): #<__main__.Student object at 0x0000000002258EF0> #<__main__.Student object at 0x0000000002258F28> for stu in students_list: print(stu) # name: xxx score: xxx # print(stu.__str__()) def systemExit(self): print("谢谢使用") exit() manger = SystemManger('v3.0','学生管理系统','大卫') while True: manger.showMenu() choice = input("请选择1-3:") if choice == '1': name = input("请输入姓名") score = int(input("请输入分数")) #创建学生对象 stu = Student(name,score) #调用添加学生的方法 manger.addStudent(stu) elif choice == '2': manger.showAllStudents() elif choice == '3': manger.systemExit() else: print("选项有误,重新输入")
控制台截图:
__str__相当于Java的tostring方法
初始化方法中设置属性的其他方法:
def __init__(self,name,age,gender,id,score)
self.name = name
...
class Student(object): def __init__(self,name,age,gender,id,score,address,tel,height,weight): # self.name = name # pass # 获得实例化对象传递过来的所有属性及属性值 dic = locals() # print(type(dic)) # print(dic) # dic.pop('self') # print(dic) for k,v in dic.items(): #设置属性的函数 setattr(self,k,v) def showInfo(self): print("name:%s age:%d 性别:%s"%(self.name,self.age,self.gender)) stu = Student('zs',18,'男','1001',89,'叫春的城市','15888888888',130,130) stu.showInfo()
1.什么叫类变量:
变量定义在类中,方法外,属于类所有,所有对象共享一份
2.与成员变量有什么区别?
定义位置不同
属于者不同
成员变量属于对象
类变量属于类
存储份数不同:
成员变量:
每个对象中都有一份
类变量:
只有一份,供所有对象共享
为什么要使用类变量?
存储份数唯一
什么情况下使用类变量?
如何使用类变量?
类变量的访问:
1.获取值
a.类名.类属性名
b.对象名.类属性名
2.设置值
类名.类属性名 = 对应值
对象名.类属性名 = 对应值
如果存在与类属性名相同的对象属性,
用对象名.属性名 优先访问 对象的
class Student(): #类变量定义类内,方法外 class_id = 210 def __init__(self,name,age): self.name = name self.age = age # self.class_id = 100 stu1 = Student('马哥',38) stu2 = Student('大龙哥',66) print("%s所在教室:%d"%(stu1.name,stu1.class_id)) print("%s所在教室:%d"%(stu1.name,Student.class_id)) #将教室id更改为211 Student.class_id = 211 #这种方式等于是给对象stu1中增加一个成员变量class_id # stu1.class_id = 211 print("更改教室后:") print("%s所在教室:%d"%(stu1.name,Student.class_id)) print("%s所在教室:%d"%(stu1.name,stu2.class_id))
注意:
类属性值修改,改的是常量池中的值
对象属性值修改,并不能影响常量池中的数据,本质上是在对象中添加了一个属性值
行为
成员方法
对象方法、类方法、静态方法
类方法
1.装饰器
@classmethod
2.有一个必要参数:
cls
访问方式:
1.类名.类方法名()
2.对象名.类方法名()
类方法中:
在类方法中可不可以访问当前类中的属性
在类方法中,不能使用self关键字
好处:
直接类名调用,不用创建对象
静态方法
@staticmethod
没有参数
类名调用
class Student(): #类变量定义类内,方法外 class_id = 210 def __init__(self,name,age): self.name = name self.age = age #在成员方法中能否访问类方法 -->以下三种方式都可以调用类方法 def test(self): # Student.test1() # self.test1() # self.__class__.test1() print("我是对象方法") # Student.test2() # self.test2() # self.__class__.test2() @classmethod def test1(cls): print("我是类方法") print("class_id:%d"%Student.class_id) print("class_id:%d"%cls.class_id) # print("name:%s"%self.name) # print("age:%s"%self.name) # Student('学生1',19).test() Student.test2() @staticmethod def test2(): print("我是静态方法") Student('学生1',19).test() # Student.test1() Student.test1() #使用对象访问类方法 stu1 = Student('学生1',18) # stu1.__class__.test1() stu1.test() Student.test2() # stu1.test2()
注意:
1、对象方法中可以调用类方法
2、类方法中可以调用对象方法
3、对象方法可以调用静态方法
4、静态方法可以调用对象方法
5、静态方法可以调用类方法
6、类方法可以调用静态方法
结论:
类方法、静态方法、对象方法之间可以相互调用
over......
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有