我正在制作一个基于文本的游戏,这是我用来建立房间属性的文件。每当我尝试通过打印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)
答案 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__
需要x
,y
和desc
参数,而且你不是'通过他们。您必须将其更改为super(Room3, self).__init__(x, y, desc)
。
但是一旦你解决了这个问题,基类就会设置self.x
等等,只是为了让你立即用新值替换它们。为什么这样?为什么即使采用 x
,y
和desc
参数来忽略它们呢?
我认为你想要的是:
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
属性。