我两次调用函数时,Python打印三次,为什么会这样呢?

时间:2018-11-15 10:21:40

标签: python

我是python的新手,我试图了解self是如何工作的。当我来自JavaScript时,我认为它与此相似。如果我错了,请纠正我。在此期间,我编写了以下代码:

class Restaurant(object):
   bankrupt = False

   def open_branch(self):
        if not self.bankrupt:
            print("branch opened")

x = Restaurant()
y = Restaurant()
y.bankrupt = True

print(y.open_branch())

print(x.open_branch())

并获得输出:

None
branch opened
None

当我两次调用open_branch()时。它不应打印三次。我认为它应该打印,

branch opened   // for first call
None           // for 2nd call

you could paste the code here and see 请有人解释一下。

4 个答案:

答案 0 :(得分:3)

最后两个打印语句仅打印返回的方法的结果:

print(y.open_branch())
print(x.open_branch())

由于默认情况下,如果您未明确指定return语句,则python返回None,并且您两次调用方法,因此,预计会看到两个None语句。

如果调用不打印的方法,则会看到一条打印的消息。

y.open_branch()
x.open_branch()

您可以通过在方法中添加return语句并像现在一样在外部进行打印来改进代码。像

class Restaurant(object):
    bankrupt = False

    def open_branch(self):
         if not self.bankrupt:
             return "branch opened"
         return "branch closed"


x = Restaurant()
y = Restaurant() 

y.bankrupt = True

print(y.open_branch())
# output:'branch closed'

print(x.open_branch())
# output: 'branch opened'

答案 1 :(得分:2)

好的,您有以下代码:

class Restaurant(object):
    bankrupt = False

    def open_branch(self):
        if not self.bankrupt:
            print("branch opened")

x = Restaurant()
y = Restaurant()

在这里,您有两个类型为“餐厅”的对象。

y.bankrupt = True

您在此处更改了存储在变量bankrupt中的对象的属性y

print(y.open_branch())

这将输出

None

仅;为什么?首先,您正在调用函数y.open_branch(),但是此函数不会输出任何内容,因为属性bankrupt为true,因此if not self.bankrupt的值为false,因此不会执行print语句。但是,函数open_branch()也没有返回任何内容(大约没有return true语句。因此print(y.open_branch())等于print(None),它将输出None

print(x.open_branch())

对于x,属性bankrupt为假,因此if not self.bankrupt为真,并且打印语句print("branch opened")将被求值。之后,将输出None,其原因与None得到print(y.open_branch())的原因相同。

答案 2 :(得分:1)

您正在做的是在print的返回值上调用open_branch

因此,当您看到它打印None时,就会看到print(x.open_branch()print(y.open_branch()的结果。

当您看到branch opened时,这就是内部 open_branch打印的结果。

尝试一下:

class Restaurant(object):
   bankrupt = False

   def open_branch(self):
        result = ""
        if self.bankrupt:
            result = "Restaurant is bankrupt"
        else:
            result = "Branch opened"
        return result

x = Restaurant()
y = Restaurant()
y.bankrupt = True

print(y.open_branch())
print(x.open_branch())

答案 3 :(得分:1)

有些事情在这里给您带来问题:

  • 您的open_branch函数未返回任何内容,因此,当您调用print(self.open_branch(x))时,它正在打印None,这是Python中所有函数默认返回的值,如果没有return语句。您可以通过替换

    来解决此问题
    if not self.bankrupt:
        print("branch opened")
    

    使用

    if not self.bankrupt:
        return "branch opened"
    
  • 您要调用print三次,这就是为什么您要在控制台上打印三行的原因(尽管如果您将函数中的print替换为{我在上面详细介绍过的return语句。

  • 您应该在else子句下放置if语句,以便它返回有用的内容(如果是None,则返回self.bankrupt == True),您可以告诉分支是否已打开。我建议像这样:

    if not self.bankrupt:
        return "branch opened"
    else:
        return "Restaurant is bankrupt, branch could not be opened"