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}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM