有效地为在另一个类中实例化的类设置属性值

时间:2017-02-27 17:08:48

标签: python instantiation

我尝试设置某个类AuxiliaryClass的属性值,而不是以最有效的方式从MainClass类中的方法中实例化。

AuxiliaryClassMainClass的方法中实例化 - 见下文。但是,AuxiliaryClass有许多不同的属性,我需要在实例化类之后设置这些属性的值 - 请参阅我的代码的最后3行。

注意由于设计限制我在这里无法解释,我的类只包含方法,这意味着我需要将属性声明为方法(见下文)

class AuxiliaryClass(object):

    def FirstMethod(self):
        return None
    ...
    def NthMethod(self):
        return None


class MainClass(object):

    def Auxiliary(self):
        return AuxiliaryClass()


def main():
    obj = MainClass()
    obj.Auxiliary().FirstMethod = #some_value
    ...
    obj.Auxiliary().NthMethod = #some_other_value
    # ~~> further code

基本上我想用更整洁,更优雅,更高效的代码替换最后3行代码。我知道如果直接实例化AuxiliaryClass我可以使用字典:

d = {'FirstMethod' : some_value,
     ...
     'NthMethod'   : some_other_value}

obj = AuxiliaryClass(**d)

但这对我的问题结构似乎不起作用。最后,我需要在实例化 AuxiliaryClass后设置MainClass的属性的值(因此我无法在方法Auxiliary中设置属性的值)。

有没有比obj.Auxiliary().IthMethod = some_value更好的方法呢?

修改

有几个人说过以下几行:

    obj.Auxiliary().FirstMethod = #some_value
    ...
    obj.Auxiliary().NthMethod = #some_other_value

将无效,因为它们会立即收集垃圾。我真的不明白这意味着什么,但如果我执行以下行(在上面的行之后):

    print(obj.Auxiliary().FirstMethod())
    ...
    print(obj.Auxiliary().NthMethod())

我得到了之前输入的值。

2 个答案:

答案 0 :(得分:2)

为了加快速度并使自定义更加清晰,您可以缓存AuxilliaryClass构造函数/ singleton / accessor的结果,并循环遍历dict调用setattr()。< / p>

尝试这样的事情:

init_values = {
    'FirstMethod' : some_value,
     :
    'NthMethod'   : some_other_value,
}

def main():
    obj = MainClass()
    aux = obj.Auxiliary() # cache the call, only make it once

    for attr,value in init_values.items():  # python3 here, iteritems() in P2
        setattr(aux, attr, value)

    # other stuff below this point

答案 1 :(得分:0)

我理解这里发生了什么:我的代码在所有允许记忆的方法之前都有一系列装饰器。我不确切知道它们是如何工作的,但是当使用上述问题时 - 即obj.Auxiliary().IthMethod = some_value类型的行立即被垃圾收集 - 不会发生

不幸的是我无法提供有关这些装饰器的更多细节1)我不太了解它们2)我不能在公司外传递这些信息。我认为在这种情况下很难回答我的问题,因为我无法完全披露所有必要的细节。