考虑我的简单课程
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没有更新修改后的值?
跟踪执行情况.
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)
那是因为您在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)