繁体   English   中英

访问__init__参数

[英]Access to __init__ arguments

是否可以访问传递给__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__ 也许有一种更简单的方法!

不,您必须存储它们。 否则,它们在__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)

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

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

一句话:不。

您可以做的是:

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

如果您发现自己需要大量执行此操作,则还可以使用装饰器来抽象任务。

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

在开始此路径之前,请先阅读“ Python的Super很漂亮,但您不能使用它”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM