Создайте экземпляр класса из строки типа типа, например "container.Room"?

-5

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

Я структурировал базу данных объектов очень просто (все в игре будет объектом, а отдельная база данных атрибутов поможет настроить вещи). Текущая структура объекта выглядит следующим образом:

objectid, name, typeclass, locationid

locationid является внешним ключом к тому же объекту, таким образом, объекты могут принадлежать комнате или игроку.

Мой вопрос связан с тем, как я хочу, чтобы была создана спецификация. В настоящее время я хочу сохранить строку там, как: container.Room. Когда я извлекаю информацию из базы данных (или создаю новую комнату), я хочу иметь возможность сделать экземпляр класса Room(), содержащегося в отдельном скрипте python, называемом контейнерами. Я знаю, что нужно делать из контейнера импортной комнаты, но я не знаю, как динамически делать это из сохраненной строки.

Заранее благодарю всех, кто может знать и поделиться со мной ответом!

редактирование для ясности (я прерывался...)

Я хочу вытащить строку из моей базы данных ("module.Class"), импортировать этот модуль и класс и создать экземпляр указанного класса.

edit2 Используя sqlite, вот моя команда создания. В конце я хочу вернуть экземпляр класса.

def create(self, **args):
#requires name=string and typeclass=string. no locationid for rooms
#connect to the sqlite db and create a cursor for commands
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()

#probably a better way to do this, but this is what I came up with
columns = []
values = []
for k, v in args.iteritems():
#iterate through arguments, if the column ends in 'id' assume int
columns.append(k)
if k[-2:] == "id":
values.append("%s" % v)
else:
values.append(("'%s'" % v))

#join columsn and rows and plug them into the query
cols = ', '.join(columns)
rows = ', '.join(values)

query = "INSERT INTO objects_db (%s) VALUES (%s)" % (cols, rows)

#execute the query, commit, and close the connection.
cursor.execute(query)
conn.commit()
conn.close()

>>> stuff here to import args['typeclass'] <<<

Поэтому я мог бы иметь такую строку, как:

myobj = create (name = "my object", typeclass= "objects.things.Thing")

Это создало бы "мой объект" в базе данных, а переменная "myobj" была бы экземпляром класса Thing, найденного в папке объектов и файле thing.py.

спросил(а) 2021-01-25T20:38:13+03:00 4 месяца, 4 недели назад
1
Решение
89

Поэтому я понял, что моя проблема связана с попыткой импортировать модули из братьев и сестер, когда я запускал собственный скрипт db.py для его проверки.

Я создал файл main.py в корневом каталоге проекта, что позволило мне сделать что-то вроде этого:

    typeclass = args['typeclass'].split('.')
import_path = "objects.%s" % typeclass[0]

_temp = importlib.import_module(import_path)
myobj = getattr(_temp, typeclass[1])

return myobj(args['name'], args['locationid'])

Функция create, над которой я работаю, используется только для объектов, поэтому я мог предположить папку с объектами. Поэтому мне просто нужны вещи. Часть части, поэтому я смог разбить ее, импортировать скрипт и получить атрибут и запустить оттуда.

ответил(а) 2021-01-25T20:38:13+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема