Python类组成混乱

时间:2016-03-30 18:20:45

标签: python

我从http://blog.thedigitalcatonline.com/blog/2014/08/21/python-3-oop-part-4-polymorphism/#.VvwAbjG1XGB

获得以下内容
class Room:
    def __init__(self, door):
        self.door = door

    def open(self):
        self.door.open()

    def close(self):
        self.door.close()

    def is_open(self):
        return self.door.is_open()

class Door:
    def __init__(self):
        self.status = "closed"

    def open(self):
        self.status = "open"

    def close(self):
        self.status = "closed"

    def is_open(self):
        return self.status == "open"

当我这样做时:

>>> door = Door()
>>> r= Room(door)
>>> r.door.is_open()
False

我认为它应该返回“关闭”而不是假,为什么这不起作用?

4 个答案:

答案 0 :(得分:4)

一切正常。此方法返回self.status == "open"的结果。默认情况下,此门为"closed",因此返回值为False

答案 1 :(得分:2)

它不起作用,因为它完全按照你的要求去做。您的代码为:

return self.status == "open" # returns True or False

而不是

return "open" if self.status == "open" else "closed"` # returns 'open' or 'closed' 

这是您正在寻找的行为。

答案 2 :(得分:1)

==中的return self.status == 'open'是Python的等式运算符,它返回True或False,具体取决于它比较的项是否相等。

要返回'关闭',返回值为return self.status

方法的名称 - is_open - 暗示它将返回一个布尔值 - TrueFalse;命名方法is_somethinghas_something是编程语言中的常用约定,表示将返回布尔值。

答案 3 :(得分:1)

您的代码中存在两个问题:

  1. 这不是关于继承而是关于组成:房间有门,但房间不是门。您没有创建继承。请修正你的头衔。
  2. 您的代码返回一个布尔值,该布尔值适用于其方法名称。对于这样的方法和这样的比较,期望一个真或假的布尔值,而不是期望一个字符串,如果你复制浪费代码。否则,重命名方法(因为它有另一个意图)并返回普通self.status