我想自动解包初始化变量一劳永逸。我的思考过程是解压所有,并使用setattr作为属性名称作为变量的名称。如何在python类的init中自动设置自我属性?
class BaseObject(object):
def __init__(self, *args):
for arg in args:
setattr(self, argname, arg)
class Sub(BaseObject):
def __init__(self, argone, argtwo, argthree, argfour):
super(Sub, self).__init__(args*)
那么你应该能够做到:
In [3]: mysubclass = Sub('hi', 'stack', 'overflow', 'peeps')
In [4]: mysubclass.argtwo
Out[4]: 'stack'
基于帕拉姆的 '堆' 已被命名为argtwo
。
这样就可以自动获得,但你仍然可以覆盖象下面这样:
class Sub(BaseObject):
def __init__(self, argone, argtwo, argthree, argfour):
super(Sub, self).__init__(arglist)
clean_arg_three = process_arg_somehow(argthree)
self.argthree = clean_arg_three
显然我卡在如何传递参数(argone,argtwo等)的实际名称为一个字符串setattr
,以及如何正确地传递ARGS到super init
(该args
super(Sub, self).__init__(args*)
的)
谢谢
那是冷血的,没想到它会变得更好。我会尽量不要如此快速地选择答案 – codyc4321
你怎么知道使用那部分堆栈?你只需使用ipdb并检查inspect.stack()? – codyc4321
几个月前,我编写了一个函数来将新变量转储到调用者的名称空间中,我想到了这一点。我想我是通过https://docs.python.org/2/library/inspect.html上的文档提示进行了试验和错误。最有用的信息是:(1)“[stack()返回]调用者堆栈的帧记录列表。返回列表中的第一个条目表示调用者;最后一个条目表示堆栈中最外面的调用。因此stack()[1]。(2)“当[stack()返回]'帧记录时,'每个记录是一个包含六个元素的元组:帧对象,...”。因此stack()[1] [0]。 –