Динамическое именование объектов и вызов классов в Python - PullRequest
0 голосов
/ 27 января 2019

Я разрабатываю язык программирования на Python, где вы можете программировать симуляцию простых машин.Я написал функцию, которая принимает некоторые входные данные, анализирует их и выясняет, каково первое слово.

Теперь для вставки первого слова мне нужно взять следующие слова obj, name, x и y.

obj: какой это простой тип машины
name: чтоВы хотите вызвать объект
x: координата X на графике
y: координата Y на графике

Я уже создал функцию nextword, которая перебирает остальную часть кода и определяет каждую переменную как эти слова, поэтому со следующим кодом:

insert pulley JohnThePulley 3 4

Он видит, что первое слово - insert,и вызывает мою функцию insert.
Затем она устанавливает obj в pulley, name в JohnThePulley и так далее.

Однако теперь мне нужно создать объект в дочернем классе pulley, в классе матери simple_machines, который имеет имя JohnThePulley и т. Д.

Ситуация IЯ в том, что для первого слова вставки, например, я вообще не знаю, каким будет следующее слово из всех вариантов дочерних классов, которые они могут вызвать.Мне нужно создать указанный объект вместе с предоставленным именем, предоставленной координатой X и предоставленной координатой Y.

Я попытался сделать простое форматирование в python, используя '{}'.format(name) или .format(obj), но те неt работа.

# 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. Что я хотел бы получить,Проще говоря, это объект с именем name в классе с именем obj с атрибутами name.x, name.y и т. д.

Однако я получаю сообщения об ошибках типа:

NameError: name 'obj' is not defined

или:

SyntaxError: can't assign to function call

Первый, по-видимому, означает, что слово obj не присваивается, но второй, по-видимому, означает, что я не могу отформатировать имя функции или отформатировать имя переменнойи определить его как функцию (хотя я создаю его экземпляр как класс).

Что я делаю не так?Как я могу это исправить?

1 Ответ

0 голосов
/ 27 января 2019

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))

Все приведенные выше решения с технической точки зрения считаются "некрасивыми", и вы, вероятно, ищетесловарь, хотя это не ООП, словари используются за кулисами, чтобы точно обрабатывать то, что вы хотите делать с объектами.Объект без методов по сути является просто словарем.

mydico = dict()
mydico[name] = obj

Кроме того, если name является строкой, то '{}'.format(name) эквивалентно name.

...