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}