Python 访问_init__参数

Python 访问_init__参数,python,Python,是否可以访问传递给\uuuu init\uuuu的参数,而不必显式存储它们 e、 g 这个用例是创建一个超级类,它可以自动存储用于创建从它派生的类的实例的参数,而不必将所有参数显式地传递给超级类的\uuuu init\uu。也许有更简单的方法 我认为您正在寻找并与super.\uuuu init\uuuu相结合 但是,在开始此路径之前请先阅读。不,您必须存储它们。否则它们将在\uuuu init\uuuu()返回后消失,因为所有局部变量都返回 如果不想显式传递所有参数,可以使用**kwargs:

是否可以访问传递给
\uuuu init\uuuu
的参数,而不必显式存储它们

e、 g


这个用例是创建一个超级类,它可以自动存储用于创建从它派生的类的实例的参数,而不必将所有参数显式地传递给超级类的
\uuuu init\uu
。也许有更简单的方法

我认为您正在寻找并与
super.\uuuu init\uuuu
相结合


但是,在开始此路径之前请先阅读。

不,您必须存储它们。否则它们将在
\uuuu init\uuuu()返回后消失,因为所有局部变量都返回

如果不想显式传递所有参数,可以使用
**kwargs

class Base(object):
    def __init__(self, name, data):
        # store name and data

class Derived(Base):
    def __init__(self, **kwargs):
        Base.__init__(self, **kwargs)

Derived(name="Peter", data=42)
一句话:不

你能做的是:

def __init__(self, *args, **kwargs):
    self.args = args
    self.kwargs = kwargs

如果您发现自己需要经常这样做,您还可以使用装饰器来抽象任务。

不完全建议这样做,但这里有一个自动存储参数变量的包装器:

from functools import wraps
def init_wrapper(f):
    @wraps(f)
    def wrapper(self, *args, **kwargs):
        func_parameters = f.func_code.co_varnames[1:f.func_code.co_argcount]

        #deal with default args
        diff = len(func_parameters) - len(args)
        if diff > 0:
            args += f.func_defaults[-diff:]

        #set instance variables
        for pos, arg in enumerate(func_parameters):
            print pos, arg
            setattr(self, arg, args[pos])

        f(self, *args, **kwargs) #not necessary to use return on __init__()
    return wrapper
用法:

class A(object):
    @init_wrapper
    def __init__(self, a, b, c):
        print a + b + c
例如:

>>> a = A(1, 2, 3)
6
>>> a.a
1
>>> a.b
2
>>> a.c
3

我在这里的回答中解释了初始化对象的各种模式:谢谢Otto,但我认为这些模式中的任何一种都与我的问题无关。我想你指的是
class thing
,而不是
def thing
Oops对不起,是的,将其更改为一个更简单的示例,并在过程中输入错误。现在已修复。没有向下投票,但这不明显有什么帮助。这篇文章不仅不相关,而且包含一些相当糟糕的建议(例如总是将
**kwargs
传递给
super
\uu init\uu
)也同意这似乎没有帮助。我当然可以将参数传递给super的
\uuuu init\uuuu
,但我宁愿避免它(尽管公平地说,从最初的问题来看,这可能不清楚)。但是,您确实链接到Python的函数调用语法,我一直想知道它在哪里得到了正确的记录:-(这正是我目前正在做的,但我想知道是否有一种方法不依赖于派生类的作者正确地传递它的所有*args和**kwargs。因为是派生的。uuu init_uu在Base期间没有返回。u init_u的作用域,有没有方法检索这些局部变量?@lost:在支持堆栈fr的Python实现中艾姆斯(皮顿公司),您可以检查调用帧并提取其局部变量,但您肯定不想这样做。我仍然不明白您正在解决什么问题。当然,dervied类必须正确调用基类的方法。每个人都必须这样做。当然,如果您试图提供一个“神奇”基类,以便派生类es“just work”难道你不希望派生类甚至不需要调用方法吗?然而,你的回答让我明白了为什么像
\uuuu args\uuuu
这样的东西不存在,所以谢谢你!啊,我想知道有什么方法可以使用代码对象。谢谢你的演示-并同意“不完全推荐”的警告!
>>> a = A(1, 2, 3)
6
>>> a.a
1
>>> a.b
2
>>> a.c
3