1、类属性:属于类本身而不是类的实例。可以使用类名或者实例名来访问。对于所有的实例来说,类属性的值是相同的,且在类的所有实例中是共享的。classProfessor:类属性departmentComputerScience实例属性definit(self,name,age):self。namenameself。ageage实例方法defintroduce(self):print(fHello,mynameis{self。name},andIam{self。age}yearsold。)访问类属性print(Professor。department)ComputerScience创建教授对象profProfessor(JohnSmith,40)访问类属性print(prof。department)ComputerScience 在上面的代码中,我们使用类名或者实例名来访问department类属性,两种方式都可以得到相同的结果,即ComputerScience。 2、实例属性:属于类的实例,只能通过实例名来访问。对于每个实例来说,实例属性的值是不同的,且在不同实例中是不共享的。classProfessor:类属性departmentComputerScience实例属性definit(self,name,age):self。namenameself。ageage实例方法defintroduce(self):print(fHello,mynameis{self。name},andIam{self。age}yearsold。)创建教授对象prof1Professor(JohnSmith,40)prof2Professor(MaryBrown,35)访问实例属性print(prof1。name)JohnSmithprint(prof2。name)MaryBrown 在上面的代码中,我们创建了两个不同的教授对象prof1和prof2,分别将它们的name属性设置为JohnSmith和MaryBrown。通过实例名来访问实例属性。 3、类方法:与类本身相关的方法,使用classmethod装饰器来定义。类方法的第一个参数通常为cls,表示类本身,可以使用类名或者实例名来调用,类方法可以访问和修改类属性,但不能访问实例属性。classProfessor:类属性departmentComputerScience实例属性definit(self,name,age):self。namenameself。ageage实例方法defintroduce(self):print(fHello,mynameis{self。name},andIam{self。age}yearsold。)类方法classmethoddefchangedepartment(cls,newdept):cls。departmentnewdept访问类属性print(Professor。department)ComputerScienceprof1Professor(JohnSmith,40)prof2Professor(JaneDoe,35)调用类方法调用类方法来修改类属性Professor。changedepartment(Mathematics)print(prof1。department)Mathematicsprint(prof2。department)Mathematics 在上面的代码中,我们使用类名调用了changedepartment类方法,将department类属性的值从ComputerScience修改为Mathematics。可以发现,这个修改是在所有的实例中都生效的。 4、实例方法:与类的实例相关的方法,使用类中的方法来定义,第一个参数通常为self,表示调用该方法的实例。只能使用实例名来调用classProfessor:类属性departmentComputerScience实例属性definit(self,name,age):self。namenameself。ageage实例方法defintroduce(self):print(fHello,mynameis{self。name},andIam{self。age}yearsold。)类方法classmethoddefchangedepartment(cls,newdept):cls。departmentnewdept实例方法defretire(self):print(f{self。name}isretiring。)self。age65创建教授对象profProfessor(JohnSmith,40)调用实例方法prof。retire()JohnSmithisretiring。print(prof。age)65 在上面的代码中,我们调用了retire实例方法,将prof对象的age属性从40修改为65。只能使用实例名来调用实例方法 5、静态方法(staticmethod),它与类和实例都没有直接的关联,它们只是存在于类的命名空间中。静态方法是使用staticmethod装饰器来定义的,它没有默认的参数,也不需要使用cls或self参数。静态方法主要用于与类相关的工具函数,它们没有默认的参数,也不需要使用cls或self参数。在使用时,我们可以使用类名或实例名来调用静态方法,而不需要创建实例对象。静态方法可以访问类属性,但不能访问实例属性,因为它们没有cls或self参数。 eg。1以教授类例子中,我们可以定义一个静态方法来计算两个教授之间的年龄差距。classProfessor:类属性universityMITdefinit(self,name,age,title,department):实例属性self。namenameself。ageageself。titletitleself。departmentdepartmentdefgreet(self):print(fHello,mynameis{self。name}。)staticmethoddefdistance(prof1,prof2):计算两个教授之间的距离returnabs(prof1。ageprof2。age)创建两个教授对象prof1Professor(JohnSmith,50,Professor,ComputerScience)prof2Professor(AliceJohnson,45,AssociateProfessor,ElectricalEngineering)调用静态方法计算两个教授之间的距离distanceProfessor。distance(prof1,prof2)print(fThedistancebetween{prof1。name}and{prof2。name}is{distance}years。) 我们定义了一个distance静态方法,它接受两个教授对象作为参数,并计算它们之间的年龄差。该方法与教授类相关,但不依赖于类的实例,因此我们使用静态方法来实现。我们可以使用类名来调用该方法,例如Professor。distance(prof1,prof2)。由于该方法没有访问实例属性,因此不需要使用self参数。 eg。2以教授为例,如何使用类名或实例名来调用静态方法。 假设我们已经定义了一个教授类Professor,并且在该类中定义了一个静态方法calculatesalary,用于计算教授的工资classProfessor:类属性universityMITdefinit(self,name,age,title,department,salary):实例属性self。namenameself。ageageself。titletitleself。departmentdepartmentself。salarysalarydefgreet(self):print(fHello,mynameis{self。name}。)staticmethoddefcalculatesalary(salary):计算教授的工资taxrate0。2税率为20taxsalarytaxratereturnsalarytax使用类名调用静态方法XXXXXXXXXXXXXXXXXXXXXXXXXXXXsalaryProfessor。calculatesalary(100000)print(fTheactualsalaryis{salary}。)使用实例名调用静态方法XXXXXXXXXXXXXXXXXXXXXXXXXXXX创建一个教授实例professorProfessor(JohnSmith,50,Professor,ComputerScience,120000)salaryprofessor。calculatesalary(120000)print(fTheactualsalaryis{salary}。) A、使用Professor。calculatesalary(100000)来调用静态方法,计算工资为100000的教授的实际工资,B、创建了一个教授实例professor,然后使用professor。calculatesalary(120000)来调用静态方法,计算该教授的实际工资。由于静态方法不依赖于类的实例,因此我们可以使用实例名或类名来调用该方法,两者的效果是一样的。 总之,静态方法可以使用类名或实例名来调用,两者的效果是一样的。在某些情况下,使用实例名调用静态方法可能更加直观和易于理解。 6、静态方法主要与类相关的工具函数 6。1工具函数:比如math库中的sqrt()方法,用于计算平方根。可以定义一个类方法,用于计算多个数的平方根。importmathclassCalculator:staticmethoddefcalculatesquares(args):squares〔〕fornuminargs:squares。append(math。sqrt(num))returnsquaresprint(Calculator。calculatesquares(16,25,36))〔4。0,5。0,6。0〕 6。2创建辅助实例或对象:比如创建配置对象,可以定义一个静态方法,用于根据给定的配置文件路径,返回一个配置对象。classConfig:definit(self,configpath):LoadandparsetheconfigurationfilepassInstancemethodtogetaconfigurationvaluedefgetvalue(self,key):Returnthevalueofthegivenkeypassstaticmethoddefloadfromfile(configpath):returnConfig(configpath)configConfig。loadfromfile(config。ini)valueconfig。getvalue(key) 6。3管理或访问类的状态:比如跟踪类实例的数量,可以定义一个静态属性来记录类实例的数量,再定义一个静态方法,用于返回实例数量。classPerson:instancecount0definit(self,name):self。namenamePerson。instancecount1staticmethoddefgetinstancecount():returnPerson。instancecountperson1Person(Alice)person2Person(Bob)print(Person。getinstancecount())2