Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更新对象';属性,但未得到反映_Python_Oop - Fatal编程技术网

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)