如何“传递”返回值?

问题描述 投票:0回答:2

我有一些带有一些计算一些数量的函数的类。全局布尔值控制函数是否应该返回值或将其存储为属性。我想要一个单独的_return_value()函数来完成此任务,而不是在每个类函数中都编写if store_value … else return …。简单的_return_value = return给出语法错误。这是一个最小的(不是)工作示例:

class foo(object):
    def __init__(self, store_value=False):

        if store_value:
            self._return_function = self._store_value
        else:
            self._return_function = self._return_value

    def _return_value(self, value):
        return value

    def _store_value(self, value):
        setattr(self, 'stored_value', value)

    def add_one(self, value):
        self._return_function(value+1)

它非常适合将值存储为类属性,即

objFoo = foo(store_value=True)
objFoo.add_one(41)
print(objFoo.stored_value)  # prints '42'

但是当我使用add_one()函数时会返回None

objFoo2 = foo(store_value=False)
print(objFoo2.add_one(41))  # expect to return '42', but returns 'None'

我如何管理_return_value()始终返回值',使add_one()在这种情况下返回42?

python function return
2个回答
0
投票

add_one转发_return_function的返回值。

def add_one(self, value):
    return self._return_function(value+1)
  • 如果_return_function设置为_store_value,则add_one将返回None
  • 如果_return_function设置为_return_value,则add_one将转发返回的值。

-1
投票

您的add_one方法返回None,因为它缺少return语句。当python函数不包含return语句时,其默认返回值为None:

def add_one(self, value):
    self._return_function(value+1)

这应该是:

def add_one(self, value):
    return self._return_function(value+1)

不过,老实说,我不知道您的班级试图解决什么问题。也许对目的进行一些解释会得出答案,提示实现该目的的更好方法。


((编辑:我假设那张选票是上一段的,所以我会在这上面扩大一点)]

似乎您的课程可以用其他更干净的方式轻松编写。我尤其不认为根据对象创建时传递的标志,使add_one执行两个不同的功能不是一个好主意。这势必会导致您遇到难以调试的错误。

考虑:

>>> foobar = foo()
>>> barfoo = foo(True)    
>>> x = foobar.add_one(5)
>>> y = barfoo.add_one(5)
>>> x
6
>>> y   # y is None!
>>>

[仅查看对add_one的两个调用,就无法确定哪个将返回整数值,而哪个将返回None。这使得很难对您的程序进行推理。

© www.soinside.com 2019 - 2024. All rights reserved.