В настоящее время я пишу модуль сериализации на Python, который может сериализовать определенные пользователем классы. для этого мне нужно получить полное пространство имен объекта и записать его в файл. Затем я могу использовать эту строку для воссоздания объекта.
например, предположим, что у нас есть следующая структура классов в файле с именем A.py
class B:
class C:
pass
теперь с предположением, что my_klass_string
- это строка «A :: B: : C "
klasses = my_klass_string.split("::")
if globals().has_key(klasses[0]):
klass = globals()[klasses[0]]
else:
raise TypeError, "No class defined: %s} " % klasses[0]
if len(klasses) > 1:
for klass_string in klasses:
if klass.__dict__.has_key(klass_string):
klass = klass.__dict__[klass_string]
else:
raise TypeError, "No class defined: %s} " % klass_string
klass_obj = klass.__new__(klass)
Я могу создать экземпляр класса C, даже если он находится в классе B
в модуле A
.
приведенный выше код эквивалентен вызов eval (klass_obj = ABC__new __ (ABC))
примечание:
Я использую здесь __ new __ ()
, потому что я воссоздаю сериализованный объект, и я не хочу запускать объект, поскольку я этого не делаю знать, какие параметры принимают методы класса __ init __
. Я хочу создать объект без вызова init , а затем назначить ему атрибуты позже.
любым способом я могу создать объект класса A.B.C
из строки. бой, как мне пойти другим путем? как получить строку, описывающую полный путь к классу из экземпляра этого класса, даже если класс вложен?