我想一次性地自动解包init变量。我的思想过程是将所有内容解包并使用setattr,变量名作为属性名。在
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*)
那么您应该能够:
^{pr2}$基于已命名为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
{cd2>如何正确地传递到arg3}的字符串中
谢谢你
使用kwargs而不是args
然后您可以:
^{pr2}${{{cd2}需要找到BaseObject.__init__(),正如urishalit建议的那样。或者,您可以使用
inspect
模块神奇地完成这项工作,子类中不需要额外的代码。这就带来了魔法的常见缺点(“怎么会发生这样的事?”)。在这在编写时很好,但是如果不定义
Sub.__init__()
,则会从错误的位置(即从调用Sub()以创建对象的函数)获取参数。您可以使用inspect
再次检查调用方是否是BaseObject
子类的__init__()
函数。或者您可以将此代码移动到一个单独的方法中,例如,set_attributes_from_my_arguments()
,并在需要这种行为时从子类的__init__()
方法中调用它。在相关问题 更多 >
编程相关推荐