1

問題は、レスポンダーを選択する前に引数を考慮する必要があることです。これが私のこれまでの試みです。

from responders import A, B, C

class RandomResponder(object)
    def init(self, *args, *kwargs):
        self.args = args
        self.kwargs = kwargs

    def __getattr__(self, name):
        # pick a responder based on the args the function was called with
        # I don't know how to do this part
        # for sake of argument lets the args a function was called with lead me to pick responder A
        r = A
        responder = r(*self.args, **self.kwargs)
        return responder.__getattr__(name)

望ましい効果は次のとおりです。

r = RandomResponder()
r.doSomething(1)
#returns A.doSomething()
r.doSomething(2)
#returns B.doSomething()
r.doSomething(3)
#return C.doSomething()
r.doSomethingElse(1)
#returns A.doSomethingElse()
r.doSomethingElse(2)
#returns B.doSomethingElse()
r.doSomethingElse(3)
#returns C.doSomethingElse()

レスポンダ A、B、C に含まれるすべての機能を事前に知ることはできません。

4

5 に答える 5

3

これを行うと

r.doSomething(1)

何が起こるかは、次のとおりです。

  • r.__getattr__が呼び出され、オブジェクトを返します
  • このオブジェクトは引数「1」で呼び出されます

が呼び出された時点__getattr__では、返されたオブジェクトがどの引数で呼び出されるか、または呼び出されるかどうかを知る方法はありませ...

したがって、必要な動作を得るには、呼び出された引数__getattr__基づいて決定を行う呼び出し可能なオブジェクトを返す必要があります。例えば

from responders import A, B, C

class RandomResponder(object):
    def __getattr__(self, name):
        def func(*args, **kwds):
            resp = { 1:A, 2:B, 3:C }[args[0]]    # Decide which responder to use (example)
            return getattr(resp, name)()         # Call the function on the responder
        return func
于 2009-01-26T03:07:59.243 に答える
2

これを試して:

class RandomResponder(object):
    choices = [A, B, C]

    @classmethod
    def which(cls):
        return random.choice(cls.choices)

    def __getattr__(self, attr):
        return getattr(self.which(), attr)

which() は選択肢からオプションをランダムに選択し、属性を取得するためにgetattrを使用します。

編集:実際には、このようなものがもっと欲しいようです。

class RandomResponder(object):
    choices = [A, B, C]

    def __getattr__(self, attr):
        # we define a function that actually gets called
        # which takes up the first positional argument,
        # the rest are left to args and kwargs
        def doCall(which, *args, **kwargs):
            # get the attribute of the appropriate one, call with passed args
            return getattr(self.choices[which], attr)(*args, **kwargs)
        return doCall

これはラムダを使用して記述できますが、わかりやすくするためにこのままにしておきます。

于 2009-01-26T03:09:31.143 に答える
1

どうですか:

RandomResponder = [A, B, C]
RandomResponder[0].doSomething()   # returns A.doSomething()
RandomResponder[1].doSomething()   # returns B.doSomething()
RandomResponder[2].doSomething()   # returns C.doSomething()
# etc
于 2009-01-26T03:02:38.677 に答える
0

あなたはこれをやろうとしていますか?

from responders import A, B, C

class RandomResponder(object)

    def pickAResponder( self, someName ):
        """Use a simple mapping."""
        return  { 'nameA': A, 'nameB': B, 'nameC': C }[someName]

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

    def __getattr__(self, name):
        """pick a responder based on the args[0]"""
        r = self.pickAResponder(self.args[0])
        responder = r(*self.args, **self.kwargs)
        return responder.__getattr__(name)

レスポンダークラス(A、B、C)は単なるオブジェクトです。マッピング、リスト、ifステートメント、pickAResponderメソッドで必要なPythonコーディングを使用して、クラスを操作できます。

于 2009-01-26T02:32:02.920 に答える
0

(アスタリスクなしで)指定するargsと、値のリスト (文字列) になります。同様に、kwargsキー (文字列) を値 (文字列) に一致させる Dict です。

これは、グーグルargs kwargsの後で見つけた最初の結果の 1 つです。

編集:あなたが探しているものを実際にはよく知らないので、これは単なる推測です.

于 2009-01-26T02:01:44.180 に答える