Python 更新对象';属性,但未得到反映
以我的简单课为例Python 更新对象';属性,但未得到反映,python,oop,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 -
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
我这里的问题是,为什么在我打印self.message[修改对象的name属性之后]时,它会打印旧值?我知道在对象创建过程中只调用了一次init方法,并且name属性当时设置为值“student1”。但是,我在下一行更改它,然后再次打印self.message不应该列出新值吗
为什么此self.message没有更新修改后的值?因为您只更改了
名称属性,而不是消息,所以它仍然打印相同的消息
您需要将消息
定义为函数
,而不是属性
。继续尝试。这是因为您在init
中初始化了self.message
,当您执行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()
输出:
student1 40
student2 40
追踪执行情况
s1=stud('student1',40)
这套
s1.姓名
至“学生1”
s1.将
标记为40
s1.信息
发送至“student1 40”
将属性值视为框。三个框中的每个框都有一个值。其中两人有关系。其中一个有一个数字。它们将保留这些值,直到它们被显式指定给。尤其是属性消息不知道它是如何获得其值的。它不知道它是通过连接name
属性和mark
属性得到它的值的。它只知道它的值是“student140”
这将输出student1 40
(毫不奇怪)
您更新了三个属性之一。但是你没有更新其他的
print s1.message
由于您从未明确更改过s1.message
,因此仍然会输出student1 40
print s1.message
点是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)
调用构造函数时,它会初始化名称
、标记
和消息
如果修改名称
,则不会调用构造函数,因此消息不会更新
不再调用此语句:
self.message=self.name + ' ' +str(self.mark)
为此,您需要一个函数或属性,以便在每次需要时计算消息
def get_message(self):
return self.name + ' ' + str(self.mark)
s1 = Stud('student1', 40)
print(s1.message)
s1.name = 'student2'
print(s1.get_message())
要使用属性,需要从对象
继承(因为此功能仅适用于Python 2中的新样式类)
你可以这样做:
class Stud(object):
def __init__(self, a, b):
self.name = a
self.mark = b
@property
def message(self):
return self.name + ' ' + str(self.mark)
s1 = Stud('student1', 40)
print(s1.message)
s1.name = 'student2'
print(s1.message)
关于代码样式的说明:
- 类名应为CAMELLE
- 变量名和函数名应为snake_大小写
是的。我注意到了这一点。但我的问题是为什么self.message在我的问题中不起作用[没有使用您刚才提供的单独函数]。但是我更改了self.name?那么self.message应该再次动态地接受新的self.name值吗?不,这就是重点。编辑了我的答案。声明类时,init
只初始化一次。@syam-Python就是不能这样工作。您是否正在考虑使用另一种编程语言?事实上,几乎每一种主流编程语言都将变量(和属性)视为框,在框中放置计算值,而这些值永远不会“动态重新分配”!这就是说,Python和其他语言一样,为您提供了语言机制,使您能够准确地看到这种外观。在Python的例子中,它是@property
。谢谢!!!但我改变了自己的名字?那么self.message应该再次动态地接受新的self.name值吗?当我现在打印self.message时,它会查找self.name,现在是新名称。?self.message是作为初始化的一部分创建的,但是self.name是一个变量,我在那之后更改了它。不,我不敢相信我在学习python 4个月后发现了这个事实。:)好问题!
class Stud(object):
def __init__(self, a, b):
self.name = a
self.mark = b
@property
def message(self):
return self.name + ' ' + str(self.mark)
s1 = Stud('student1', 40)
print(s1.message)
s1.name = 'student2'
print(s1.message)