类变量引用本身?

2024-04-26 00:01:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新的编码阶段(3个星期),并一直在建设和重建一个RPG,以帮助教自己的原则,我一直在学习。然而,我似乎停留在Python类的一个特定方面。你知道吗

我为worldLocation类创建的类变量读取NORTHEASTSOUTHWEST所有引用字符串:

WHITEROOM = worldLocation('A Plain White Room',
                          '...\n\nWhere are you?\n\n'
                          'All around you is white...\n\n'
                          '...only white...',
                          [ROCK.GROUNDDESC],
                          [RAT.NAME],
                          {NORTH: 'A Plain White Room',
                           SOUTH: 'A Plain White Room',
                           EAST: 'A Plain White Room',
                           WEST: 'A Plain White Room'})

但我希望它改为这样读,每个实例变量引用类变量本身:

WHITEROOM = worldLocation('A Plain White Room',
                          '...\n\nWhere are you?\n\n'
                          'All around you is white...\n\n'
                          '...only white...',
                          [ROCK.GROUNDDESC],
                          [RAT.NAME],
                          {NORTH: WHITEROOM,
                           SOUTH: WHITEROOM,
                           EAST: WHITEROOM,
                           WEST: WHITEROOM})

但是,每次尝试将其更改为后者时,都会收到undefined name WHITEROOM错误。我做错了什么或错过了什么?你知道吗

类别代码如下:

class worldLocation(object):
    def __init__(self, NAME, DESC, GROUND, ENEMIES, DIRECTIONS):
        self.NAME = NAME
        self.DESC = DESC
        self.GROUND = GROUND
        self.ENEMIES = ENEMIES
        self.DIRECTIONS = DIRECTIONS

Tags: nameselfyoudescroomwhitewestsouth
3条回答

您可以完成您想要完成的事情,但是在声明变量之前不能引用它。你知道吗

例如,不能说A={'key':A},因为在创建dict之前,它不能用作'key'的值。你知道吗

试试这个:

WHITEROOM = worldLocation('A Plain White Room', '...\n\nWhere are you?\n\nAll around you is white...\n\n...only white...', [ROCK.GROUNDDESC], [RAT.NAME], {})
WHITEROOM.DIRECTIONS = {NORTH: WHITEROOM, SOUTH: WHITEROOM, EAST: WHITEROOM, WEST: WHITEROOM}

为什么这样做?好的,worldLocation构造函数__init__将创建worldLocation对象并将其赋给变量WHITEROOM。然后我们可以使用点操作符访问WHITEROOM.DIRECTIONS变量,并将一个新的dict传递给它,该变量使用WHITEROOM变量作为WHITEROOM对象的引用。 它不像你想的那么优雅,但我想这样你就能做你想做的事了。你知道吗

您要使用的代码试图引用字典中作为参数传递给__init__()的实例,但它不存在。这是不可行的(如果你仔细想想,可以说是非常合理的)。你知道吗

但是,您可以通过创建一个特殊值来解决这个问题,类初始值设定项__init__()方法可以检查并修复正在传递的数据。你知道吗

下面的代码说明了我的意思。注意我在开始时添加了一些脚手架,使其能够运行以进行测试。你知道吗

#### Some scaffolding for testing.
NORTH, SOUTH, EAST, WEST = 'NORTH SOUTH EAST WEST'.split()

class ROCK:
    GROUNDDESC = 'ground desc'

class RAT:
    NAME = 'Ricky'
####


class WorldLocation:
    THIS = object()  # A unique value.

    def __init__(self, NAME, DESC, GROUND, ENEMIES, DIRECTIONS):
        self.NAME = NAME
        self.DESC = DESC
        self.GROUND = GROUND
        self.ENEMIES = ENEMIES

        # Replace any values in DIRECTIONS dictionary argument that refer to the
        # instance being created (as designated by them being the class
        # attribute THIS).
        self.DIRECTIONS = {direction: self if value is self.THIS else value
                               for direction, value in DIRECTIONS.items()}


WHITEROOM = WorldLocation('A Plain White Room',
                          '...\n\nWhere are you?\n\n'
                          'All around you is white...\n\n'
                          '...only white...',
                          [ROCK.GROUNDDESC],
                          [RAT.NAME],
                          {NORTH: WorldLocation.THIS,
                           SOUTH: WorldLocation.THIS,
                           EAST: WorldLocation.THIS,
                           WEST: WorldLocation.THIS})

# Show that it works.
from pprint import pprint

print(f'id(WHITEROOM): 0x{id(WHITEROOM):08x}\n')
pprint(vars(WHITEROOM))

样本输出:

id(WHITEROOM): 0x010d0390

{'DESC': '...\n'
         '\n'
         'Where are you?\n'
         '\n'
         'All around you is white...\n'
         '\n'
         '...only white...',
 'DIRECTIONS': {'EAST': <__main__.WorldLocation object at 0x010D0390>,
                'NORTH': <__main__.WorldLocation object at 0x010D0390>,
                'SOUTH': <__main__.WorldLocation object at 0x010D0390>,
                'WEST': <__main__.WorldLocation object at 0x010D0390>},
 'ENEMIES': ['Ricky'],
 'GROUND': ['ground desc'],
 'NAME': 'A Plain White Room'}

变量直到函数返回后才获得值,因此不能在函数的参数中引用它。在赋值变量之后,必须添加这些引用。你知道吗

WHITEROOM = worldLocation('A Plain White Room', '...\n\nWhere are you?\n\nAll around you is white...\n\n...only white...', [ROCK.GROUNDDESC], [RAT.NAME], {})
WHITEROOM.DIRECTIONS = {NORTH: WHITEROOM, SOUTH: WHITEROOM, EAST: WHITEROOM, WEST: WHITEROOM}

相关问题 更多 >

    热门问题