0

我正在制作一个基于文本的游戏,这是我用来建立房间属性的文件。每当我尝试通过打印 room3 的房间描述(打印 Room3.desc)来测试此文件时,我都会收到错误消息:AttributeError: type object 'Room3' has no attribute 'desc'

  class Room:
    def __init__(self, x, y, desc):
        self.x=x
        self.y=y
        self.desc=desc



class Room1(Room):
    def __init__(self, x, y, desc):
        super(Room1, self).__init__()
        self.x=0
        self.y=0
        self.desc="""

        A Metal Hallway
        This place is dimly lit and cool
        ----------------------------------------------------
        You stand in the middle of an intersection in a metal room.
        There are blue glowing lamps lighting this area up. There
        is a sign on the wall.
        ----------------------------------------------------
        Obvious exits:East, North"""

class Room2(Room):
    def __init__(self, x, y, desc):
        super(Room2, self).__init__()
        self.x=1
        self.y=0
        self.desc="""

        Thacker's Main Control Room
        This place is well lit and cool
        ----------------------------------------------------
        There are multiple panels throughout with a variety of levers and buttons.
        People stand in uniforms infront of computers, which are scattered throughout the room.
        There is a glass window here revealing space.
        Thacker is sitting here in the back of the room in a large chair.
        ----------------------------------------------------
        Obvious exits:West"""

class Room3(Room):
    def __init__(self, x, y, desc):
        super(Room3, self).__init__()
        self.x=0
        self.y=1
        self.desc== """


        Large Hanger Bay
        This place is well lit and cool
        ----------------------------------------------------
        There are a variety of mobile suits here
        ----------------------------------------------------
        Obvious exits:South"""


print("%s" % Room3.desc)
4

7 回答 7

2

您试图desc通过对类本身的引用来访问,但 desc 是在构造函数中定义的,这意味着它仅在类的实例中可用。

这表明您的代码存在一个普遍问题:您正在定义 Room 的子类,而您真正想要的是创建 Room 类的实例:

room1 = Room(0, 0, """A Metal Hallway...")
room2 = Room(1, 0, """Thacker's main control room...")
etc...
于 2013-05-09T21:16:54.670 回答
1

您的__init__方法定义实例的属性,而不是类的属性。如果你有这样的事情:

class Room3(Room):
  desc = 'foo'
  ...

那么会有这样的事情Room3.desc。事实上,你需要这样的东西:

r = Room3(x, y, 'foo')
print(r.desc)

更多信息,请阅读docs.python.org上的教程,关于类的部分。

于 2013-05-09T21:15:22.050 回答
1

Room3.desc 是实例属性而不是属性。您无法访问类对象上的实例属性——它们不存在。

您没有使用 Room3 的实例,而是使用类,因此您无法访问不存在的属性。如果要访问默认实例属性,可以创建一次性实例:

print Room3(None, None, None).desc

此外,您对超类init方法的调用将在实例构造中失败,因为您没有传递必需的参数。

于 2013-05-09T21:15:54.523 回答
1

如前所述cmddesc不是Room3类对象的属性,而是每个Room3 实例的属性。

我认为这里真正的问题是你不想Room3成为 ; 的子类Room。你只想要一个. Room没有特定于 的代码或属性Room3,很难想象您将创建一堆Room3实例。

所以你可能想要的是:

room3 = Room(1, 0, """blah blah""")

现在你可以print room3.desc了,它会正常工作。


同时,如果您确实Room3成为一个班级,那么您的设计存在很多问题:

def __init__(self, x, y, desc):
    super(Room3, self).__init__()
    self.x=0
    self.y=1
    self.desc== """…"""

首先,该super调用将引发异常,因为Room.__init__需要xydesc参数,而您没有传递它们。您必须将其更改为super(Room3, self).__init__(x, y, desc).

但是一旦你解决了这个问题,基类就会设置self.x等,只是为了让你立即用新值替换它们。为什么要这样做?为什么还要使用 x,ydesc参数来忽略它们?

我想你想要的是这样的:

def __init__(self):
    super(Room3, self).__init__(0, 1, """…""")

这实际上是一种非常常见的模式(尽管不像 C++ 和 Java 这样的语言那么常见),其中您有一个基类,其中包含一些可以采用任意值的变量,以及对其中一些变量具有特定值的子类。

但是,正如我所说,我认为这不是您想要的模式。我认为您只想要一个room3实例Room,而不是子类。


最后,要回答您直接提出的问题,“如何打印子类的属性?”,这很容易。只需打印它。这就是鸭子打字的工作原理。例如:

class Base(object):
    def print_x(self):
        print self.x

class Derived(Base):
    def __init__(self, x):
        self.x = x

base = Derived(3)
base.print_x()
于 2013-05-09T21:16:20.810 回答
1

print("%s" % Room3.desc)

desc是 Room3 实例的属性,而不是 Room3 类本身的属性。如果你实例化 Room3,那么你可以访问它的属性 desc。还要小心你的__init()__,因为你有一个额外的=

class Room3(Room):
    def __init__(self, x, y, desc):
        super(Room3, self).__init__()
        self.x=0
        self.y=1
        self.desc== """

最后一行应该是self.desc= """

于 2013-05-09T21:21:18.563 回答
0

Room3类没有属性desc。该类的实例可以。所以这样的事情会起作用:

room3 = Room3()
print(room3.desc)
于 2013-05-09T21:14:14.033 回答
-1

self.desc== """

有一个额外的=。而且您必须实例化Room3才能访问该desc属性。

于 2013-05-09T21:13:25.923 回答