Python2内省命名空间

时间:2016-02-09 17:12:43

标签: python oop design-patterns introspection anti-patterns

我以一种奇怪的方式尝试python内省。 例如,我有Class LoggerManager,它包含用于统计的特定记录器类的池。我知道这不是标准的方法,但我不能使用mixins,因为我的类ObjectLogger的对象可以序列化到代码中的json,我真的不想将self.data throw params传递给 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将ref保存到上面的命名空间,我可以友好的方式得到一个实例? 好的,伙计。正确问的问题包括正确答案本身。 我只需要:

import inspect
def my_method(self):
    parent_self = inspect.currentframe().f_back.f_locals['self']
    do_something_with_parent_self(parent_self)

0 个答案:

没有答案