0

是否可以访问传递给 的参数__init__,而无需显式存储它们?

例如

class thing(object):
  def __init__(self, name, data):
    pass # do something useful here

t = thing('test', [1,2,3,])
print t.__args__ # doesn't exist

>> ('test', [1,2,3])

用例是创建一个超类,它可以自动存储用于创建从它派生的类的实例的参数,无需将所有参数显式传递给超类__init__。也许有更简单的方法来做到这一点!

4

4 回答 4

8

不,您必须存储它们。否则,它们会在__init__()返回后消失,就像所有局部变量一样。

如果您不想显式传递所有参数,可以使用**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)
于 2012-07-18T18:21:03.853 回答
3

这并不完全推荐,但这里有一个自动存储参数变量的包装器:

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
于 2012-07-18T19:39:02.020 回答
0

一句话:没有。

你可以做的是:

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

如果您发现自己需要做很多事情,您还可以使用装饰器来抽象任务。

于 2012-07-18T19:08:58.883 回答
-1

我认为您正在寻找任意参数列表关键字参数super.__init__.

不过,在开始这条道路之前,请先阅读“Python 的 Super 很漂亮,但你不能使用它” 。

于 2012-07-18T18:20:54.687 回答