从类型类字符串创建类的实例,例如' containers.Room'?

时间:2016-10-07 22:29:34

标签: python python-2.7

我是编程新手,而且我选择了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文件中找到。

1 个答案:

答案 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部分,所以我能够拆分它,导入脚本并获取属性并从那里运行。