使用面向对象(学生管理系统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晓码阁 版权所有