代码改变世界

python统计班级学生

2020-09-13 11:04  清风软件测试开发  阅读(1982)  评论(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}