我尝试设置某个类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)
但这对我的问题结构似乎不起作用。最后,我需要在实例化 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())
我得到了之前输入的值。
答案 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)我不能在公司外传递这些信息。我认为在这种情况下很难回答我的问题,因为我无法完全披露所有必要的细节。