【问题标题】:When a function in a class returns a value, where is it returned to?当类中的函数返回一个值时,它返回到哪里?
【发布时间】:2012-08-04 00:03:10
【问题描述】:

我一直在学习类并且我的代码可以工作,但我只是想知道返回的值去哪里了?

代码:

from sys import exit
from random import randint

class Game(object):

    def __init__(self, start):
        self.pie = [ 'pie test']

        self.start = start

    def play(self):
        next_room_name = self.start
        while True:
            print "\n--------"
            room = getattr(self, next_room_name)
            next_room_name = room()

    def rooom(self):
        print "Test worked. good job"
        return "piez"

    def piez(self):
        print "pie room"
        exit(1)


a_game = Game("rooom")
a_game.play()

例如,在上面的代码中,我在 rooom() 中返回“piez”,它现在将我带到 piez(self) 函数。但是,返回值将我带到哪里?

它是否在类外返回“piez”并使用新值重新进入类?它是否将字符串 "piez" 返回到 init(self, start) ?我只是将值返回到前一个函数 play(self) 吗?

除此之外,一切正常,但我只是不明白我是如何到达piez(self) 函数的,只是在前一个函数中返回“piez”。过去我只是通过用 () 输入函数的名称来跳转函数,但是这样我会返回一个字符串并且不确定我是如何跳转的。

这是我的观察:

1.) 将 Game("Rooom") 类实例化为 a_game

2.) 从 a_game 我们调用 play() 函数

3.) "Rooom" 被发送到 init 并分配给 self.start

4.) play(self) 启动并使用初始化函数 self.start 并设置为 next_room_name

5.) 循环开始。从 next_room_name 中获取下一个函数并分配给房间

6.) next_room_name 被分配给 room() 。突然跳到 rooom(self)

7.) 我们到达 rooom(self) 并返回“piez”

8.) ?? Piez 在某个地方返回......我们现在在piez(self)

有人可以帮我填补空白吗?这让我疯狂。我希望我说得通……我一直在努力理解这一点一个小时,即使在分解它之后,我似乎也误解了一些东西。

【问题讨论】:

  • 类方法就像普通函数一样。在尝试学习课程之前,请先了解函数的工作原理。
  • @Antimony 我对常规函数做得很好。我只需输入他们的名字 function() ,然后它就到那里了。我不明白这是怎么回事:\
  • 常规函数也可以返回值。当他们这样做时,您使用像a = function() 这样的语法。如果你明白这一点,你就会明白这段代码。
  • @Marius 是的,它有 - 请参阅 self.play 中的 getattr 调用。

标签: python class python-2.7 return


【解决方案1】:

您在这里有点困惑:

5.) 循环开始。从 next_room_name 中获取下一个函数并分配给房间

6.) next_room_name 被分配给 room() 。突然跳到 rooom(self)

如果等号存在,则任何语句的返回值都分配到等号的左侧。

当你写作时

x = hello()

这意味着:

"打招呼并将任何返回值存储在x中"

应该是这样的

"room()调用的函数的返回值存储在next_room_name"

希望这可以为您澄清。

【讨论】:

  • 谢谢!这很有意义。我一定错过了关于功能的那部分。所以返回值总是去任何调用它的那个?太棒了。
  • 是的,最后它总是“返回”(明白吗?)给调用它的人,然后执行调用者中的下一行。
  • @Danielle 您可以将返回值视为就地替换函数调用,就像变量被它们的值替换一样 - 也就是说,你第一次做:room = getattr(self, next_room_name) 变成 room = getattr(self, 'rooom') 变成 self.rooom (因为这就是 getattr 返回的内容);那么next_room_name = room() 变为 next_room_name = self.rooom() 变为 next_room_name = 'piez'
  • @Ivc 我不确定 replace 是否是正确的术语;因为该行不会“就地”改变(正如您的评论所暗示的那样)。
  • @BurhanKhalid 确实,这并不是真正发生的事情,但它是一个合理的心理模型(这就是为什么我说'你可以把它想象成......',而不是'它确实' - 这是一个近似值)。
猜你喜欢
  • 2017-12-24
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
  • 2014-02-26
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
相关资源
最近更新 更多