我是编程新手,而且我选择了Python。我已经通过艰难的方式完成了所有的学习python,我已经编写了自己的选择你自己的冒险游戏'现在我开始创造更类似于MOO的东西。
我构建了我的对象数据库非常简单(游戏中的所有内容都是一个对象,一个单独的属性数据库将帮助自定义事物)。当前对象结构如下:
objectid,name,typeclass,locationid
locationid是一个返回相同objectid的外键,对象可以属于某个房间或玩家。
我的问题是如何设置类型类。目前我想在那里存储一个字符串,如:containers.Room。当我从数据库中提取信息(或创建一个新的房间)时,我希望能够创建一个类Room()的实例,该类包含在一个名为containers的单独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 =&#34; my object&#34;,typeclass =&#34; objects.things.Thing&#34;)
这将创造一个“我的对象”。在数据库中,&#39; myobj&#39;变量将是Thing类的一个实例,可以在objects文件夹和things.py文件中找到。
答案 0 :(得分:0)
所以我发现我的问题是由于在我直接运行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'])
我正在处理的创建函数仅用于对象,因此我能够假设一个对象文件夹。所以我只需要这些东西.Thing部分,所以我能够拆分它,导入脚本并获取属性并从那里运行。