zoukankan      html  css  js  c++  java
  • python统计班级学生

    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}
  • 相关阅读:
    The FLARE On Challenge
    CVE-2013-2551漏洞成因与利用分析(ISCC2014 PWN6)
    CVE-2014-0322漏洞成因与利用分析
    CVE-2013-3897漏洞成因与利用分析
    译:《深入解析WINDOWS VISTA APC》——PART 1
    MemoryInjector 无痕注入
    一个APC引起的折腾 之题外记
    一个APC引起的折腾
    2020
    javascriptcore调试笔记
  • 原文地址:https://www.cnblogs.com/111testing/p/13660650.html
Copyright © 2011-2022 走看看