3

クラスでいくつかの引数を機能させようとしていますが、関数で*args を使用する方法の関数で既に実行していますか? .

その関数をクラスに取り込もうとしていますが、*args を取るinit関数を持つクラスを初期化する方法を理解していないようです。コードは次のとおりです。

class classname(object):
    def __init__(self, *args):
        <code-snip>
        ...
        </code-snip>

if __name__ == "__main__":
    start = classname()
    start()

ここで、「start()」をどうするかについて混乱しています。「start(*sys.argv[1:])」または「start()」を使用する必要がありますか? どちらもうまくいかないようです。initで期待される *argsが適切に渡されるようにしたい。

ポインタをください。

ありがとうございます。

======

どのように機能しなかったかの詳細が明確でなかったら申し訳ありません。

a) start(*sys.argv[1:]) の使用中

Traceback (most recent call last):
  File "check.py", line 126, in <module>
    start(*sys.argv[1:])
TypeError: 'check' object is not callable

b) start() を使用しているときに、次のようになります。

Traceback (most recent call last):
  File "check.py", line 126, in <module>
    start()
TypeError: 'check' object is not callable

これらは出てきたエラーでした。

@alko、はい、あなたは正しいです。initの *args を適切に渡す方法を探していました。

4

2 に答える 2

7

オブジェクトは、引数をクラス コンストラクターに渡すことによってインスタンス化されます。それらは関数で順番に初期化され__init__ます。あなたの例では、これは

start = ClassName(*sys.argv[1:])

その式は次のように処理されます。

  1. classname の新しいインスタンスは、ローカルのobject.__new__(ClassName, *sys.argv[1:])名前空間の名前付きでインスタンス化されます。これ以降、オブジェクトはスクリプト内で参照される可能性があります。startstartif __name__ == "__main__"
  2. その内容は、 を呼び出して順番に初期化されますstart.__init__(*sys.argv[1:])。args to__init__は、コンストラクターに渡されるものと同じであることに注意してください。

また、Python の命名規則についてはPEP 8を参照してください。あれは:

クラス名は通常、CapWords 規則を使用する必要があります。

于 2013-11-07T08:19:55.637 に答える
0

あなたの例には、最初にインスタンス化されたクラスが含まれています-これには呼び出しが含まれ__init__()、次に呼び出されます-これは呼び出しによって行われ__call__()ます.

start = classname(...)したがって、に渡すために、あなたのものを呼び出しに入れる必要があります__init__()

ただし、__call__()メソッドが含まれていない限り、新しくインスタンス化されたオブジェクトへの呼び出しは失敗します。あなたが私たちに何を教えてくれたら、それは答えやすかったでしょう

どちらもうまくいかないようです。

まさに意味します。

于 2013-11-07T08:27:55.933 に答える