如何在python类的init中自动设置自属性?

2024-09-27 09:31:43 发布

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

我想一次性地自动解包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}的字符串中

谢谢你


Tags: selfcleaninitdefargargsclasssuper
3条回答

使用kwargs而不是args

class BaseObject(object):
    def __init__(self, **kwargs):
        for argname, arg in kwargs.iteritems():
            setattr(self, argname, arg)

class Sub(BaseObject):
    def __init__(self, argone, argtwo, argthree, argfour):
        super(Sub, self).__init__(argone=argone, argtwo=argtwo,   argthree=argthree)

然后您可以:

^{pr2}$
import inspect

class BaseObject(object):
    def __init__(self, args):
        del args['self']
        self.__dict__.update(args)

class Sub(BaseObject):
    def __init__(self, argone, argtwo, argthree, argfour):
        args = inspect.getargvalues(inspect.currentframe()).locals
        super(Sub, self).__init__(args)

s = Sub(1, 2, 3, 4)

{{{cd2}需要找到BaseObject.__init__(),正如urishalit建议的那样。或者,您可以使用inspect模块神奇地完成这项工作,子类中不需要额外的代码。这就带来了魔法的常见缺点(“怎么会发生这样的事?”)。在

import inspect

class BaseObject(object):
    def __init__(self):
        frame = inspect.stack()[1][0]
        args, _, _, values = inspect.getargvalues(frame)
        for key in args:
            setattr(self, key, values[key])

class Sub(BaseObject):
    def __init__(self, argone, argtwo, argthree, argfour):
        super(Sub, self).__init__()

这在编写时很好,但是如果不定义Sub.__init__(),则会从错误的位置(即从调用Sub()以创建对象的函数)获取参数。您可以使用inspect再次检查调用方是否是BaseObject子类的__init__()函数。或者您可以将此代码移动到一个单独的方法中,例如,set_attributes_from_my_arguments(),并在需要这种行为时从子类的__init__()方法中调用它。在

相关问题 更多 >

    热门问题