Python中的动态对象命名和类调用

时间:2019-01-27 15:03:35

标签: python oop string-formatting

我正在用Python开发一种编程语言,您可以在其中编程简单机器的模拟。我编写了一个函数,该函数接受一些输入,对其进行解析,然后找出第一个单词是什么。

现在,对于第一个单词插入,我需要取下一个单词objnamexy

  

obj :它是什么类型的简单计算机
   name :您要调用的对象
   x :图形上的X坐标
   y :图形上的Y坐标

我已经制作了一个函数nextword,该函数遍历代码的其余部分,并将每个变量定义为这些单词,因此使用以下代码:

insert pulley JohnThePulley 3 4

它看到第一个单词是insert,并调用了我的insert函数。
然后,将obj设置为pulley,将name设置为JohnThePulley,依此类推。

但是,现在我需要在子类pulley下的子类simple_machines中创建一个对象,其名称为JohnThePulley,等等。

例如,对于第一个单词插入,我所处的情况是,我完全不知道下一个单词是什么,因为它们可以调用的子类的所有选择都是如此。我需要创建指定的对象以及提供的名称,提供的X坐标和提供的Y坐标。

我尝试使用'{}'.format(name).format(obj)在python中进行简单格式化,但是这些无效。

# Insert function
def insert(code):
    c = 4
    syntax = np.array([obj, name, x, y])
    nextword(parser.code_array, syntax, c)
    objc += 1
    return


# Nextword function, code_array[0] is insert, syntax is an array that
# contains all the variables that need to be defined for any function
def nextword(code_array, syntax, c):
    assert len(code_array) == c + 1, "Too Many Words!"
    for m in range(0, c):
        syntax[m] = code_array[m + 1]
    return


# Mother Class simple_machines with properties
class simple_machines:
    def __init__(self, obj, name, x, y, coords):
        self.obj = (
            obj
        )  # what type of obj, in this case, pulley
        self.name = name  # name, JohnThePulley
        self.x = x  # 3 in this case
        self.y = y  # 4 in this case
        self.coords = (x, y)  # (3,4) in this case
        return


# Pulley Class, here so I can later define special properties for a pulley
class pulley(simple_machines):
    def __init__(self, name, x, y):
        super(simple_machines, self).__init__()
        return


# Code that I tried
def insert(code):
    c = 4
    syntax = np.array([obj, name, x, y])
    nextword(parser.code_array, syntax, c)
    "{}".format(name) = "{}".format(obj)(
        name, x, y
    )  # this is what my
    # instantiation would look like, formatting an object with name, then
    # calling a class formatted with obj, and inserting their input of
    # name,x,y as the properties
    return

我希望在pulley中创建一个名称为JohnThePulley的对象,并且坐标X = 3和Y =4。简单来说,我想得到的结果是具有属性nameobj等的名为name.x的类中名为name.y的对象

但是,我收到如下错误:

NameError: name 'obj' is not defined

或:

SyntaxError: can't assign to function call

第一个显然意味着未分配单词obj,但是第二个显然意味着我无法格式化函数名称或格式化变量名称并将其定义为函数(甚至尽管我将其实例化为一个类。

我在做什么错?我该如何解决?

1 个答案:

答案 0 :(得分:1)

name 'obj' is not defined是因为obj是在另一个函数中定义的。您必须单独使用MYOBJECT.obj,而不是obj,并且还要保留对MYOBJECT的引用。

'{}'.format(obj)(name,x,y)没什么意思,'{}'.format(obj)是一个字符串,不可调用。

SyntaxError: can't assign to function call是您似乎感兴趣的实际问题。您可以执行globals()['{}'.format(name)] = stuff,但它不适用于局部变量和对象(并且您的后代不会喜欢)。

如果要对对象执行相同操作,则可以使用setattr(MYOBJECT, '{}'.format(name), '{}'.format(obj))

以上所有解决方案在技术上都被认为是“丑陋的”,您可能正在寻找的只是字典,虽然不是OOP,但在幕后使用字典来准确地处理您想做的事情对象。没有方法的对象本质上就是正义字典。

mydico = dict()
mydico[name] = obj

此外,如果name是字符串,则'{}'.format(name)等效于name