2015-04-25 2 views
-1

Так что я пытаюсь есть файл, который имеет кучу объекта в нем, что выглядит следующим образом:Как создать класс Python из строки?

<class 'oPlayer.oPlayer'>,123,4,<class 'CommonObject.Wall'>,175,4,<class 'CommonObject.Wall'>,25,654,<class 'CommonObject.Wall'>,1,123,<class 'CommonObject.Wall'>,55,87 

(никаких новых строк для целей расщепления)

Файл содержит имя объекта, х, и y координаты. (Основная информация) Но я не уверен на 100%, как создавать объекты из файла. Вот что у меня есть:

def loadRoom(self, fname): 

    # Get the list of stuff 
    openFile = open(fname, "r") 
    data = openFile.read().split(",") 
    openFile.close() 

    # Loop through the list to assign said stuff 
    for i in range(len(data)/3): 

     # Create the object at the position 
     newObject = type(data[i * 3]) 
     self.instances.append(newObject(int(data[i * 3 + 1]), int(data[i * 3 + 2]))) 

Объекты в файле все принимают два аргумента: x и y. Поэтому я также смущен тем, как это будет работать. То, что я сделал, это захватить список со всеми разделенными строками (что я отобразил, оно получилось правильным. Нет \ n), затем я просматриваю список (сортировку), чтобы установить все данные. Я предположил, что type вернет объект, но это не так.

Любая помощь с указанной темой очень ценится.

+5

Где сделал это Файл появился? Где определяются классы? Что тут происходит?! Вы просто ищете [pickle] (https://docs.python.org/2/library/pickle.html)? – tzaman

+0

попробуйте встроенную функцию типа, см. Мой ответ здесь http://stackoverflow.com/a/8576049/29489 – number5

+3

'type' не возвращает объект, потому что у вас нет объектов, только строк. Вы не можете магически восстановить объект со всеми его связанными свойствами и методами из строки, которая говорит ''. – MattDMo

ответ

-1

Попробуйте подход от Get python class object from string:

import importlib 
... 
for i in range(len(data)/3):  
     # get object data 
     cls = data[i * 3] 
     x = int(data[i * 3 + 1]) 
     y = int(data[i * 3 + 2]) 

     # get module and class 
     module_name, class_name = cls.split(".") 
     somemodule = importlib.import_module(module_name) 

     # instantiate 
     obj = getattr(somemodule, class_name)(x, y) 

     self.instances.append(obj) 

Вот полный образец (поместить его в файл с именем getattrtest.py):

import importlib 

class Test1(object): 
    def __init__(self, mx, my): 
     self.x = mx 
     self.y = my 

    def printit(self): 
     print type(self) 
     print self.x, self.y 

class Test2(Test1): 
    def __init__(self, mx, my): 
     # changes x and y parameters... 
     self.y = mx 
     self.x = my 

def main(): 
    cls = 'getattrtest.Test2' 
    # get module and class 
    module_name, class_name = cls.split(".") 
    somemodule = importlib.import_module(module_name) 

    # instantiate 
    obj = getattr(somemodule, class_name)(5, 7) 
    obj.printit() 

if __name__ == "__main__": 
    main() 

Испытано с Python 2.7

+0

Я попробовал ваше решение, но кажется, что объект фактически не создается. Я пытаюсь вызвать одну из функций суперкласса объектов, но это не позволяет мне. Как создать объект после? (Спасибо за ответ.) – null

+0

@Paolo: Я добавил полный образец к моему ответу, который показывает, что он работает, включая вызовы функций суперкласса. Возможно, проблема в 'oPlayer.oPlayer' или' CommonObject.Wall' – gus27

Смежные вопросы