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

2024-09-29 23:29:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

AuxiliaryClass是在MainClass的方法中实例化的-见下文。但是,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)

但这似乎对我的问题结构不起作用。最后,我需要在实例化MainClass之后设置AuxiliaryClass属性的值(因此我不能在方法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())

我正在获取以前输入的值。你知道吗


Tags: 实例方法代码selfobjreturn属性value
2条回答

为了加快速度,并使定制变得更简洁,您可以缓存AuxilliaryClass构造函数/单例/访问器的结果,并循环调用dict^{}。你知道吗

尝试以下操作:

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

我理解这里发生的事情:我的代码在所有允许记忆的方法之前有一系列的修饰符。我不知道它们具体是如何工作的,但是当使用上面描述的问题时,obj.Auxiliary().IthMethod = some_value类型的行立即被垃圾收集-不会发生。你知道吗

不幸的是,我不能提供更多的细节,因为1)我不太了解他们,2)我不能把这些信息传输到我的公司以外。我认为在这种情况下很难回答我的问题,因为我不能完全披露所有必要的细节。你知道吗

相关问题 更多 >

    热门问题