2

クラスのインスタンスは、それが引数として使用されているかどうか、それが定位置引数かキーワード引数か、定位置かどうか、どの位置にあるか、キーワードかどうか、どのキーワードに割り当てられているか、そしてこれらすべてに続くかどうかを知ることができますか?その知識に基づいて、インスタンスプロパティの1つなど、それ自体を他の何かに解決/返す/置き換えるので、呼び出しはそれをクラスインスタンス自体ではなく引数として取得しますか?

クラスの質問がどんどん狂っていることに気づきました。私をユーモアを交えてくれてありがとう。

4

1 に答える 1

3

いいえ - それは不可能です。

どうすれば近づくことができるかを考えようとしています-関数への引数をループして引数にこの情報を伝えるデコレータを定義できます。

def toldargs(f):
    def wrapper(*args, **kargs):
        for i, arg in enumerate(args):
            arg.you_are_arg_number(i)
        for k in kargs:
            kargs[k].you_are_karg_named(k)
        return f(*args, **kargs)
    return wrapper

@toldargs
def myfunction(a, b):
    ...

(未コンパイル/未テスト)。

これは、頻繁に呼び出される関数で使用すると、パフォーマンスに大きく影響します。また、メソッドを呼び出す前に、何らかの種類の try/catch またはインスタンス テストが必要になる可能性があります。これは、そのような呼び出しを想定していない引数でのエラーを回避するためです。

更新- もう少し考えてみると、(おそらく) 何かが関数に渡されるタイミングはあまり気にしませんが、インスタンスに対する何らかの操作が呼び出されたときのコンテキストはどうなるか (arg が関数に渡されたが使用されない場合、それなら問題ありません、いずれにせよ私が考えることができます)。

言い換えると:

def some_function(a, b):
    # here you can't trigger anything
    ...
    a.foo() # but here you can

.foo()呼び出されると、コンテキストを調べることができます。さまざまなアプローチがあります-最も明白/粗雑なのは、例外をスローしてキャッチし、コールスタックを調べることです。ここですべてのツールを使用することもできます。たとえば、現在のスタックを調べて、特定のクラス内から呼び出されているかどうかを確認できます。

繰り返しますが、これは遅くて複雑になる可能性があります...

更新 2 - Python:メタクラス ベースのアプローチのためのクラス インスタンスの初期化前に渡された引数の変更を参照してください。

于 2012-05-03T09:36:18.370 に答える