Можно ли динамически c создать экземпляр класса, записанного в строке, без необходимости записи его в файл? - PullRequest
0 голосов
/ 24 апреля 2020

Как создать экземпляр класса, хранящегося в необработанной строке my_class без необходимости сначала сохранять эту строку в файл ?

my_class = r'''class A:
    def print(self):
        print('Hello World')
    '''

my_class_object = string_to_class()

my_class_object.print()

В приведенном выше коде я ' Я ищу реализацию функции string_to_class(), которая возвращает объект класса внутри my_class.

Ожидаемый результат кода выше Hello World.

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Как насчет редактирования строки немного?

my_class_with_new_object = my_class + "\nnew_object = A()"

my_class_with_new_object будет:

class A:
    def print(self):
        print('Hello World')

new_object = A()

Вызов exec(my_class_with_new_object), и он создаст объект new_object типа A

Тогда просто позвоните new_object.print()

2 голосов
/ 24 апреля 2020

Вам просто нужно использовать exec: он поддерживает динамическое c выполнение кода Python.

import re 
def string_to_object(str_class, *args, **kwargs):
    exec(str_class)
    class_name = re.search("class ([a-zA-Z_][a-zA-Z0-9_]*)", str_class).group(1)
    return locals()[class_name](*args, **kwargs)

Вы можете использовать функцию string_to_object для автоматического создать объект указанного класса:

my_class = '''
class A:
    def print(self):
        print("Hello World")
'''
a = string_to_object(my_class)
a.print() # Hello World

Вы также можете построить что-то более сложное:

my_class = '''
class B:
    def __init__(self, a, b, c=0, d=1):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
'''
b = string_to_object(my_class, 4, 5, c=7)
print(b.a) # 4
print(b.b) # 5
print(b.c) # 7
print(b.d) # 1

А также:

class C:
    pass

my_class = '''
class D(C):
    pass
'''

d = string_to_object(my_class)
...