python 2.7 classmethod无法按预期工作[内部详细信息]

python 2.7 classmethod无法按预期工作[内部详细信息],python,python-2.7,Python,Python 2.7,这是我编写的代码,我希望@classmethod在我设置等级时更改所有等级,我设置等级99,正如您所看到的,当我打印实例std_1的等级时,它打印了我设置的原始等级(100),而不是我想要的等级(99),并执行以下操作: student.set_grade(99) 给了我同样的结果 class student: num_of_std = 0 def __init__(self , first , last , grade): self.first = f

这是我编写的代码,我希望@classmethod在我设置等级时更改所有等级,我设置等级99,正如您所看到的,当我打印实例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)

首先,这段代码并不像我写的那样为我运行。std+=1的
student.num\u给出了一个错误,因为此时未定义student

因此,我对您的代码进行了如下轻微修改,希望保留您的意图:

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))
我明白了

作为我的输出

如您所见,您定义的类方法更改了类本身的
grade
属性,而不是调用它的实例的属性。当您访问
std_1.grade
时,您会得到实例属性,该属性没有改变,因此仍然是
100

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


我不太确定您期望的行为是什么,如果这不能回答您的问题,请给我留下评论,我可以更新我的答案进行解释。

仅限不将等级作为实例属性的实例(如果在
\uuuu init\uuu
中设置了等级,则没有一个实例)将返回class属性。您可以使用classmethod设置class属性
grade
,然后访问instance属性,因此当然可以获得instance属性的值。如果需要class属性,则需要在类上访问它,因此
student.grade
。另一方面,你应该坚持PEP8的惯例,用
大写的
来给学生命名。给我同样的结果
std_1.grade: 100
student.grade: 99