如何打印子类的属性?

时间:2013-05-09 21:11:33

标签: python class printing

我正在制作一个基于文本的游戏,这是我用来建立房间属性的文件。每当我尝试通过打印room3的房间描述(打印Room3.desc)来测试这个文件时,我收到错误:AttributeError:type object'Room3'没有属性'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)

7 个答案:

答案 0 :(得分:2)

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

这指出了代码的一般问题:你正在定义Room的子类,当你真正想要的是创建类Room的实例时:

room1 = Room(0, 0, """A Metal Hallway...")
room2 = Room(1, 0, """Thacker's main control room...")
etc...

答案 1 :(得分:1)

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

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

然后会出现Room3.desc这样的事情。事实上,你需要这样的东西:

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

有关详细信息,请参阅docs.python.org上的教程“类”一节。

答案 2 :(得分:1)

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

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

print Room3(None, None, None).desc

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

答案 3 :(得分:1)

正如cmd所说,desc不是Room3类对象的属性,它是每个Room3 实例的属性。< / p>

我认为这里的真正的问题是你不希望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等等,只是为了让你立即用新值替换它们。为什么这样?为什么即使采用 xydesc参数来忽略它们呢?

我认为你想要的是:

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()

答案 4 :(得分: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= """

答案 5 :(得分:0)

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

room3 = Room3()
print(room3.desc)

答案 6 :(得分:-1)

self.desc== """

还有一个=。您必须实例化Room3才能访问desc属性。