为什么getter和setter不适用于代码中的一个类,而适用于其他类

2024-09-28 22:56:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我不明白为什么我的getter和setter在代码的前两个类中工作,而在第三个类中却不工作

我看了类似的问题,但能找到一个对我有帮助的,对不起,如果有什么我错过了。我对Python还是有点陌生,所以我意识到它可能是我刚刚错过或还没有意识到的东西

我的代码:

class Person():
    intTotalPeople = int(0)

    def __init__(self, firstName, lastName, gender, age):
        'Obtain name, gender, gender, and age'
        self.firstName = firstName
        self.lastName = lastName
        self.gender = gender
        self.age = age

    @property
    def firstName(self):
        return self.__firstName

    @property
    def lastName(self):
        return self.__lastName

    @property
    def gender(self):
        return self.__gender

    @property
    def age(self):
        return self.__age

    @firstName.setter
    def firstName(self, firstName):
        if firstName != str(firstName):
            raise Exception('firstName should contain letters only. The value entered was: {}'.format(firstName))
        else:
            self.__firstName = firstName

    @lastName.setter
    def lastName(self, lastName):
        if lastName != str(lastName):
            raise Exception('lastName should contain letters only. The value entered was: {}'.format(lastName))
        else:
            self.__lastName = lastName

    @age.setter
    def age(self, age):
        if age == int(age):
            self.__age = age
        elif age == float(age):
            self.__age = age
        else:
            raise Exception('age should contain numbers only. The value entered was: {}'.format(age))

    @gender.setter
    def gender(self, gender):
        if gender == "Female":
            self.__gender = gender
        elif gender == "Male":
            self.__gender = gender
        else:
            raise Exception('gender must be either Male or Female only. The value entered was: {}'.format(gender))


class Student(Person):
    'Class for data pertaining to current students'

    intTotalFemale = int(0)
    intTotalMale = int(0)
    dblTotalGPA = float(0)
    dblAverageGPA = float(0)
    intTotalFemaleAge = int(0)
    intTotalMaleAge = int(0)
    dblAverageFemaleAge = float(0)
    dblAverageMaleAge = float(0)

    def __init__(self, firstName, lastName, gender, age, GPA):
        Person.__init__(self, firstName, lastName, gender, age)
        self.GPA = GPA

        Person.intTotalPeople += 1
        Student.dblTotalGPA += self.GPA

        if self.gender == "Female":
            Student.intTotalFemale += 1
            Student.intTotalFemaleAge += self.age
        else:
            Student.intTotalMale += 1
            Student.intTotalMaleAge += self.age

    @property
    def GPA(self):
        return self.__GPA

    @GPA.setter
    def GPA(self, GPA):
        if GPA < 0:
            raise Exception('GPA must be zero or greater. The value you entered was: {}'.format(GPA))
        elif GPA > 4.0:
            raise Exception('GPA must be 4.0 or less. The value you entered was: {}'.format(GPA))
        else:
            self.__GPA = GPA

    def CalcAverageGPA(self):
        Student.dblAverageGPA = Student.dblTotalGPA / Person.intTotalPeople

    def CalcAverageAgeByGender(self):
        if self.gender == "Female":
            Student.dblAverageFemaleAge = Student.intTotalFemaleAge / Student.intTotalFemale
        else:
            Student.dblAverageMaleAge = Student.intTotalMaleAge / Student.intTotalMale

    def __str__(self):
        return "\nAverage GPA: " + str(Student.dblAverageGPA) + "\nAverage Age of Male Grads: " + str(
            Student.dblAverageMaleAge) + "\nAverage Age of Female Grads: " + str(Student.dblAverageFemaleAge)


class Graduate(Student):
    intFemaleJobs = int(0)
    intMaleJobs = int(0)
    intTotalGrads = int(0)

    def __init__(self, firstName, lastName, gender, age, GPA, gradYear, jobStatus):
        Student.__init__(self, firstName, lastName, gender, age, GPA)
        self.gradYear = gradYear
        self.jobStatus = jobStatus
        Graduate.intTotalGrads += 1

        if self.gender == "Female":
            if self.jobStatus == "Y":
                Graduate.intFemaleJobs += 1
        else:
            if self.jobStatus == "Y":
                Graduate.intMaleJobs += 1

    @property
    def GradYear(self):
        return self.__gradYear

    @property
    def JobStatus(self):
        return self.__jobStatus

    @GradYear.setter
    def GradYear(self, gradYear):
        if gradYear == int(gradYear):
            self.__gradYear = gradYear
        else:
            raise Exception('gradYear must be in YYYY format. The value you entered was: {}'.format(gradYear))

    @JobStatus.setter
    def JobStatus(self, jobStatus):
        if jobStatus != "Y":
            raise Exception('jobStatus must be Y or N. The value you entered was: {}'.format(jobStatus))
        elif jobStatus != "N":
            raise Exception('jobStatus must be Y or N. The value you entered was: {}'.format(jobStatus))
        else:
            self.__jobStatus = jobStatus

    def __str__(self):
        return "Total Graduate Students: " + str(self.intTotalGrads) + Student.__str__(
            self) + "\nTotal Male Graduates with Jobs: " + str(
            Graduate.intMaleJobs) + "\nTotal Female Graduates with Jobs: " + str(Graduate.intFemaleJobs)
# import StudentClass file to access Student class
import StudentClass

# ---------------------------------------------------
# MAIN - Call Graduate class and include first name, 
#        last name, gender, GPA, age, grad year,
#        and job status in argument 
#        and display totals and averages
# ---------------------------------------------------

objStudent1 = StudentClass.Graduate("Katie", "Schmidt", "Female", 29, 4.00, 2009, "Y")
objStudent2 = StudentClass.Graduate("Tammy", "Schmidt", "Female", 60, 3.75, 1978, "Y")
objStudent3 = StudentClass.Graduate("Fred", "Schmidt", "Male", 60, 3.25, 1978, "N")
objStudent4 = StudentClass.Graduate("Emma", "Schmidt", "Female", 35, 2.00, 2002, 2)
objStudent5 = StudentClass.Graduate("Richard", "Evans", "Male", 55, 2.10, 1985, "Y")

StudentClass.Student.CalcAverageGPA(objStudent5)
StudentClass.Student.CalcAverageAgeByGender(objStudent1)
StudentClass.Student.CalcAverageAgeByGender(objStudent5)

print(objStudent5)

Tags: selfformatageifdeffirstnamegenderstudent