在python类中更新了对象的属性,但没有得到反映

sya*_*yam 4 python oop

考虑我的简单课程

class stud():
    def __init__(self,a,b):
        self.name=a
        self.mark=b
        self.message=self.name + ' ' +str(self.mark)

s1=stud('student1',40)
print s1.message  --->output=student1 40 
s1.name='student2'
print s1.message ----> output =student1 40 , but i expected student2 40
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么当我打印self.message [在修改对象的name属性后],它打印旧的值?我知道init方法在对象创建期间只调用一次,name属性在那时设置为值'student1'.但是,我正在改变下一行,再次打印self.message不应该列出新值?

为什么这个self.message没有更新修改后的值?

Ray*_*oal 6

跟踪执行情况.

s1=stud('student1',40)
Run Code Online (Sandbox Code Playgroud)

这套

  • s1.name"student1"
  • s1.mark 到40岁
  • s1.message"student1 40"

将属性值视为框.三个盒子中的每一个都有一个值.其中两个拿着弦.其中一人持有一个号码.他们将保留这些值,直到明确指定它们为止.特别是属性消息没有IDEA如何获得它的价值.它不知道它通过连接name属性和mark属性来获得它的价值.它所知道的是它所具有的价值"student1 40".

print s1.message
Run Code Online (Sandbox Code Playgroud)

这输出student1 40(毫不奇怪)

s1.name='student2'
Run Code Online (Sandbox Code Playgroud)

您更新了三个属性中的一个.但你没有更新其他人.

print s1.message
Run Code Online (Sandbox Code Playgroud)

由于您从未明确更改过s1.message,因此仍然会输出student1 40.

关键是值s1.message只是一个字符串.没有看不见的计算,只要初始化它的表达式发生变化,它就会自动更新它.其他语言可能也是这样,但Python却没有.

如果您想要这种行为,请执行以下操作:

class stud():
    def __init__(self,a,b):
        self.name=a
        self.mark=b

    @property
    def message():
        return self.name + ' ' +str(self.mark)
Run Code Online (Sandbox Code Playgroud)


she*_*nzy 5

那是因为您在self.message中初始化了init,而当您这样做时s1.name = student2,您只更改了self.name,而self.message已经初始化。

如果你想得到self.message,你想以某种方式更新它的值。

什么会起作用:

class stud():
    def __init__(self,a,b):
        self.name=a
        self.mark=b

    def the_message(self):
        self.message = self.name + ' ' + str(self.mark)
        return self.message

s1 = stud('student1',40)
print s1.the_message() 

s1.name='student2'
print s1.the_message() 
Run Code Online (Sandbox Code Playgroud)

输出:

student1 40
student2 40
Run Code Online (Sandbox Code Playgroud)