同一个类中要做装饰器的时候,也需要函数里面的wrapper函数带上不定长参数,使用了私有属性,方便装饰器的使用,所以的话,总结就是要不断地试错,先不要着急问他人,自己想办法解决,我认为这样才能够成长,思维才能够提升。 出错地方就是wrapper未带参数,以及Average函数里面不该有self, 很明显,self 存的就是调用该实例方法的实例对象的引用 所以!谁调用实例方法,self 就是谁! 应用场景: 创建一个Students类,打印出学生总分、平均分、学生信息,由于平均分会由总分除以科目数,所以,可以应用到装饰器来求平均分。 正确的解答如下:
class Students(): def __init__(self, name, num, sex, e_score, m_score, c_score): self.name = name self.num = num self.sex = sex self.e_score = e_score self.m_score = m_score self.c_score = c_score def Average(fun_name): def wrapper(*args, **kwargs): print("平均分为:{}".format(fun_name(*args, **kwargs)/3)) return wrapper @Average def AllScore(self): s = self.e_score + self.m_score + self.c_score print("总分为{}".format(s)) return s def message(self): print("学生姓名为:{},年龄为:{},性别为:{},英语成绩为:{},数学成绩为:{},语文成绩为:{}".format(self.name, self.num, self.sex, self.e_score, self.m_score, self.c_score)) if __name__ == "__main__": s = Students("wiwiyixiao", "21", "女", 80, 90, 100) s.AllScore() # s.Average() s.message()
打印结果:
总分为270
平均分为:90.0
学生姓名为:wiwiyixiao,年龄为:21,性别为:女,英语成绩为:80,数学成绩为:90,语文成绩为:100