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のスーパーは気の利いたものですが、使用することはできません」と読んでください。

于 2012-07-18T18:20:54.687 に答える