【问题标题】:Python3.5 function that calls object's method returns None instead of objectPython3.5函数调用object的方法返回None而不是object
【发布时间】:2016-07-14 17:49:11
【问题描述】:

我有一个类和一个函数试图更新和返回这个类的实例:

class Foo:
    def __init__(self):
        self.datum = 'a'
    def update(self):
        self.datum = 'b' if self.datum == 'a' else 'a'

def updater(foo_obj):
    return( foo_obj.update() )

但调用 updater() 返回 Nones 而不是类 Foo 的实例。为什么是这样?我可以改变什么来获得想要的结果?

type(updater(Foo())) #NoneType

【问题讨论】:

  • 你没有从Foo.update返回任何东西。
  • 在下面查看我对 Dipak 回答的评论

标签: python python-3.x return


【解决方案1】:

更新方法更新程序。

def updater(foo_obj):
    foo_obj.update()
    return( foo_obj )

return self 来自类函数:

def update(self):
        self.datum = 'b' if self.datum == 'a' else 'a'
        return self

【讨论】:

  • 第一个是我想要的。为什么将它分成两行会完全改变效果?
  • @Taylor 因为你返回的是对象本身,而不是 .update() 的返回值,即 None
  • 是的,有道理。我觉得以前没有遇到过这种情况很愚蠢。
【解决方案2】:

您的 update 方法不返回任何内容,这在 Python 中意味着它隐式返回 None。如果你希望它有一个有意义的返回值,你必须明确地这样做。例如:

def update(self):
    self.datum = 'b' if self.datum == 'a' else 'a'
    return self.datum

【讨论】:

    【解决方案3】:

    如果您希望 update 返回 Foo 类的实例,则必须使用 return 语句明确地让它这样做,否则它将隐式返回 None(即它是一个 void 方法,即使尽管 Python 不使用这些术语,因为它是鸭式的)。这样做:

    def update(self):
        self.datum = 'b' if self.datum == 'a' else 'a'
        return self
    

    如果您不希望您的班级这样做,您也可以在 updater 中返回 Foo 对象,如下所示:

    def updater(foo_obj):
        foo_obj.update()
        return foo_obj
    

    如果您只想返回 self.datum 而不是整个对象,请执行以下操作:

    def update(self):
        self.datum = 'b' if self.datum == 'a' else 'a'
        return self.datum
    

    或类似:

    def updater(foo_obj):
        foo_obj.update()
        return foo_obj.datum
    

    【讨论】:

      猜你喜欢
      • 2019-12-20
      • 2019-10-18
      • 2022-07-11
      • 1970-01-01
      • 2018-05-24
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多