是否可以访问传递给__init__
的参数,而无需显式存储它们?
e.g。
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__
。也许这是一种更简单的方法!
答案 0 :(得分: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)
答案 1 :(得分: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
答案 2 :(得分:0)
一句话:不。
你能做的是:
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
如果你发现自己需要做很多事情,你也可以使用装饰来抽象任务。
答案 3 :(得分:-1)
我认为您正在寻找arbitrary argument lists和keyword arguments以及super.__init__
。
在开始使用此路径之前,请先阅读"Python's Super is nifty, but you can't use it"。