Some of these disadvantages could be overcome by using more features and idioms of Python. If most objects in a game are singletons, a simple framework could maintain references to these singletons, allow references to them by string name, and instantiate them on first reference. A hypothetical naive translation of CoD I6 to Python syntax that assumes a library with these features (non-PAWS):
class Foyer(Location): name = 'Foyer of the Opera House' description = """ You are standing in a spacious hall, splendidly decorated in red and gold, with glittering chandeliers overhead. The entrance from the street is to the north, and there are doorways south and west. """ s = travel_to('Bar') w = travel_to('Cloakroom') n = """ You've only just arrived, and besides, the weather outside seems to be getting worse. """ class Cloakroom(Location): description = """ The walls of this small room were clearly once lined with hooks, though now only one remains. The exit is a door to the east. """ e = travel_to('Foyer') class Hook(Scenery, Supporter): def description(self): return ("It's just a small brass hook, " + "with a clock hanging on it." if self.has_child('Cloak') else "screwed to the wall.") aliases = ['small', 'brass', 'hook', 'peg'] is_in = 'Cloakroom' # ...
This would still allow inheritance and other forms of instantiation and instance references. Decorators and property descriptors are other ways to make the game text more succinct and intuitive, though I didn’t use them above.
I tend to favor domain-specific languages for stuff like this, but it’s interesting to think how close Python can come.