python统计班级学生
2020-09-13 11:04 清风软件测试开发 阅读(2046) 评论(0) 编辑 收藏 举报python统计班级学生
如下场景:
假设我有一个学生类和一个班级类,想要实现的功能为:
执行班级人数增加的操作、获得班级的总人数;
学生类继承自班级类,每实例化一个学生,班级人数都能增加;
最后,我想定义一些学生,获得班级中的总人数。
思考:这个问题用类方法做比较合适,为什么?因为我实例化的是学生,但是如果我从学生这一个实例中获得班级总人数,在逻辑上显然是不合理的。同时,如果想要获得班级总人数,如果生成一个班级的实例也是没有必要的。
class ClassTest(object): __num = 0 @classmethod def addNum(cls): cls.__num += 1 @classmethod def getNum(cls): return cls.__num # 这里我用到魔术方法__new__,主要是为了在创建实例的时候调用累加方法。 def __new__(self): ClassTest.addNum() return super(ClassTest, self).__new__(self) class Student(ClassTest): def __init__(self): self.name = '' a = Student() b = Student() print(ClassTest.getNum())
有一个计数器(属性),统计总共实例化了多少个对象
要求:统计班级一共有多少学生
class Student: school = 'Luffycity' count = 0 def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex self.count += 1 def learn(self): print('%s is learning' % self.name) stu1 = Student('alex', 'male', 38) stu2 = Student('jinxin', 'female', 78) stu3 = Student('Egon', 'male', 18) print(Student.count) # 输出:0 print(stu1.count) # 输出:1 print(stu2.count) # 输出:1 print(stu3.count) # 输出:1
从以上结果可以看出,如果写成self.count ,他就会变成对象的属性,无法共享给类,所以说虽然实例化了3次,但是类的count值为0,每个对象的count值为1
从以下验证代码可以看出:
print(stu1.__dict__) print(stu2.__dict__) print(stu3.__dict__) 结果为 {'name': 'alex', 'age': 'male', 'sex': 38, 'count': 1} {'name': 'jinxin', 'age': 'female', 'sex': 78, 'count': 1} {'name': 'Egon', 'age': 'male', 'sex': 18, 'count': 1}
所以说正确的代码实例如下:
class Student: school = 'Luffycity' count = 0 def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex # self.count += 1 Student.count += 1 def learn(self): print('%s is learning' % self.name) stu1 = Student('alex', 'male', 38) stu2 = Student('jinxin', 'female', 78) stu3 = Student('Egon', 'male', 18) print(Student.count) #输出:3 print(stu1.count) #输出:3 print(stu2.count) #输出:3 print(stu3.count) #输出:3 print(stu1.__dict__) #输出:{'name': 'alex', 'age': 'male', 'sex': 38} print(stu2.__dict__) #输出:{'name': 'jinxin', 'age': 'female', 'sex': 78} print(stu3.__dict__) #输出:{'name': 'Egon', 'age': 'male', 'sex': 18}