【问题标题】:Does accessing a methods returned value re-run the method?访问方法返回值是否会重新运行该方法?
【发布时间】:2017-12-17 08:58:08
【问题描述】:

在学习 Python 和一般编程时,我遇到了一个我不太确定的概念。我正在编写一个脚本,我很好奇我是否已经创建了对象,如果我想从该对象的方法之一访问返回的值,它会重新运行该方法,还是简单地回复这些值。例如:

class ClassOne():
    def oneMethod(self):
        x = 2
        y = 10
        return x, y

class ClassTwo():
    def twoMethod(self, x, y):
        ...

newObject = ClassOne()
newObject.oneMethod()

secondObject = ClassTwo()

# My question is, will the lines below re-execute newObject.oneMethod()
# or will it simply pull the already returned value

secondObject.twoMethod(newObject.oneMethod()[0],
                       newObject.oneMethod()[1])

虽然我的脚本不一定大到足以担心性能问题,但这只是我想知道的,在网上找不到太多信息。

【问题讨论】:

    标签: python python-3.x class methods


    【解决方案1】:

    您的标题与正文提出了不同的问题。

    不,访问方法的结果不会重新运行该方法。但这不是你在这里做的;您显式调用该方法两次,所以它当然会运行两次。

    正常的做法是将返回的值分配给一个变量,然后根据需要多次使用它。

    【讨论】:

    • 感谢您的回复!最后一点,您通常会在哪里定义该变量以及它会是什么样子?谢谢!
    • @Neemaximo 您可以在twoMethod 调用之前的行上执行类似coords = newObject.oneMethod() 的操作,您可以将其更改为secondObject.twoMethod(coords[0], coords[1])
    【解决方案2】:

    答案是肯定的,每次调用该方法都会重新执行。

    您可以通过在oneMethod() 中添加对print() 的调用来验证它的代码是否在每次调用时都被执行。你会发现确实如此。

    您可以通过将返回值绑定到某些变量来避免重新执行,例如

    a, b = newObject.oneMethod()    # will call and execute the code in oneMethod()
    secondObject = ClassTwo()
    secondObject.twoMethod(a, b)
    

    这里的元组 (2, 10) 将从 oneMethod() 返回,并将解包到变量 ab 中,这样 a = 2b = 10。您还可以使用单个元组变量,然后通过索引访问各个元素:

    t = newObject.oneMethod()
    secondObject.twoMethod(t[0], t[1])
    # secondObject.twoMethod(*t)    # also works, see below...
    

    另一种无需先保存返回值的方法是,使用* 运算符进行元组解包,将oneMethod() 的返回值直接传递给twoMethod()

    secondObject = ClassTwo()
    secondObject.twoMethod(*newObject.oneMethod())
    

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多