Пространство имен 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)

0 ответов

Другие вопросы по тегам