Пространство имен Python2 для самоанализа
Я пробую интроспекцию Python каким-то странным образом. Например, у меня есть Class LoggerManager, который инкапсулирует пул определенных классов логгеров для статистики. Я знаю, что это не стандартный способ сделать это, но я не могу использовать миксины из-за того, что мой объект класса SpecificLogger сериализуем в коде json, и я действительно не хочу передавать параметры броска self.data в init (в этом на случай, если мне нужно переписать много строк кода и снова получить проблему с мусором при сериализации).
class LoggerManager(object):
def __init__(self):
self.data
self.b = SpecificLogger()
self.c = SpecificLogger2()
...
class SpecificLogger(LoggerGeneral):
def get_data(self):
global data #now I want get object from namespace object of LoggerManager, not really global
do_something_with_data(data)
Я хочу, чтобы поведение, как этот код с mixins:
import json
class A(object):
def __init__(self):
self.data = 'something'
def create_pool_of_specific_objects(self):
self.obj = B()
class B(A):
def __init__(self):
A.__init__(self)
def do_something_with_data(self):
print(self.data)
self.data = 'new_data'
print(self.data)
def save(self):
return json.dumps(self.__dict__, ensure_ascii=False)
def hack_save(self):
data_to_dumped = {x:y for x,y in self.__dict__.iteritems() if x != 'obj'}
return json.dumps(data_to_dumped, ensure_ascii=False)
b=B()
b.create_pool_of_specific_objects()
b.do_something_with_data()
b.save() #will raise exception due to we have all stuff from instance of class A there
b.hack_save() #will work but it is very ugly and unusable with runtime modify object of A class
Теперь я написал код с помощью GC, но используя метод get_objects, у меня есть какие-то накладные расходы, не так ли?
import json
import gc
class A(object):
def __init__(self):
self.data = 'something'
self.obj = B()
class B(object):
def __init__(self): pass
def do_something_with_data(self):
for obj in gc.get_objects(): #or even for obj in globals().values()
if isinstance(obj, A):
print(obj.data)
obj.data = 'new_data'
print(obj.data)
def save(self):
return json.dumps(self.__dict__, ensure_ascii=False)
a=A()
b=B()
b.do_something_with_data()
b.save() #will work
Любое предложение сделать это с самоанализом, а не наследования и GC накладные расходы? Может быть, Python сохранит ссылку на пространство имен выше, и я смогу получить экземпляр в дружественной манере? Хорошо, парень. Правильно заданный вопрос включает в себя правильный ответ. Все что мне нужно это:
import inspect
def my_method(self):
parent_self = inspect.currentframe().f_back.f_locals['self']
do_something_with_parent_self(parent_self)