python 2.7 classmethod无法正常工作[详细内容]

时间:2018-07-25 07:05:19

标签: python python-2.7

这是我编写的代码,当我set_grade我将@ 99设置为您看到的等级时,我希望@classmethod更改所有类的等级,并且当我打印实例std_1的等级时它将打印我设置的原始等级(100 ),而不是我想要的(99)并执行的操作:

student.set_grade(99) 

给我相同的结果

class student:

    num_of_std = 0

    def __init__(self , first , last , grade): 
        self.first = first
        self.last = last
        self.grade = grade


    student.num_of_std += 1

    @classmethod
    def set_grade(cls , change_grade):
        cls.grade = change_grade

    def full_name(self):     
        return '{} {}: {}'.format(self.first , self.last , self.grade)


std_1 = student('Jone' , 'Jones' , 100)

std_1.set_grade(99)
print(std_1.grade)

1 个答案:

答案 0 :(得分:0)

首先,此代码未按我的要求运行。 student.num_of_std += 1出现错误,因为此时尚未定义学生。

因此,我对您的代码做了如下修改,希望可以保留您的意图:

class student:

num_of_std = 0

def __init__(self , first , last , grade): 
    self.first = first
    self.last = last
    self.grade = grade
    student.num_of_std += 1

@classmethod
def set_grade(cls , change_grade):
    cls.grade = change_grade

def full_name(self):     
    return '{} {}: {}'.format(self.first , self.last , self.grade)


std_1 = student('Jone' , 'Jones' , 100)

std_1.set_grade(99)
print("std_1.grade: " + str(std_1.grade))
print("student.grade: " + str(student.grade))

我明白了

std_1.grade: 100
student.grade: 99

作为我的输出。

如您所见,您定义的类方法更改了 class 本身的grade属性, 不是 在调用它的实例上。当您访问std_1.grade时,将获得 instance 属性,该属性未更改,因此仍然为100

如果要更改调用set_grade的实例的等级,请删除@classmethod批注。

我不太确定您所期望的行为,如果这不能回答您的问题,请给我评论,然后我可以更新我的回答以进行解释。