从类中访问类属性

2024-04-25 18:11:15 发布

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

我正在为一个游戏制作一个幻想的编程语言,所以我正在用python编写语言和解释器。该语言作为一个命令流工作,每一个命令在每一个“步骤”中都被解释。输入一个代码字符串,并将其转换为命令对象列表。解释器处理命令,但有些命令需要能够访问解释器的属性

例如,解释器跟踪活动命令(从第一个命令开始编号),因此goto命令需要更改活动命令。当前的方法是将数据传递到命令中,然后对其进行修改,解释器将其属性设置为等于

self.current = active.evaluate(self.current)

这将当前命令号设置为与输入的当前命令号计算的活动命令相同。整个街区都是这样的:

        if active.complete():  # on command completion
            type = active.return_type  # get return type
            # passes in requested data to modify
            if type == "var":  # changing var stream
                self.var = active.evaluate(self.var)
            elif type == "stream":  # changing packet stream
                self.stream = active.evaluate(self.stream)
            elif type == "current":  # changing current packet
                self.current = active.evaluate(self.current)
            elif type == "value":  # returns argument for next command
                self.holder = active.evaluate(self.var)
                self.resolve = True
            elif type == "none":
                active.evaluate()

这似乎是一种不同的方法,有没有更好的方法从类内部修改类属性


Tags: 方法命令self语言streamif属性var
1条回答
网友
1楼 · 发布于 2024-04-25 18:11:15

我的简单答案是简单地传入解释器本身,并让对象更改解释器上的相关属性。如果您不想太多地打破现有的格式,可以给evaluate()函数两个参数:

def evaluate(interpreter, field_name):
    interpreter.setattr(field_name, some_value)

你会这样称呼它

active.evaluate(self, "var")

然而,这似乎是一个实现多态性的好地方,它既可以解决您所问的问题,也可以消除对不断增长的if语句堆栈的需求

首先,假设您有一个命令超类:

class Command:
    def complete():
        # do something, return a boolean

    def evaluate(interpreter):
        raise NotImplementedException()

目前,您似乎正在使用命令的return_type来更改您对命令的操作。但是为什么不简单地检测将要运行的命令类型,并相应地实例化具有不同行为的不同子类呢

class GotoCommand(Command):
    def evaluate(interpreter):
        interpreter.current = some_value

class PacketCommand(Command):
    def evaluate(interpreter):
        interpreter.stream = some_other_value

...

之后,您可以在解释器中调用active.evaluate(self),甚至不必关心它是哪种命令

相关问题 更多 >