2

私がやろうとしていることの(簡略化された)コードは次のとおりです。

class a:
    pass

class b:
    def printSelf(self):
        print self


instOfA = a()
instOfB = b()
instOfA.printSelf = instOfB.printSelf
instOfA.printSelf()
  <__main__.b instance at 0x0295D238>

instOfA.printSelf() を呼び出すと、自分自身が instOfB として出力されます。
しかし、instOfA.printSelf() を呼び出すときは自分自身を instOfA に、instOfB.printSelf() を呼び出すときは instOfB にしたい
のですが、クラス a で printSelf を手動で定義せずにこれを行うにはどうすればよいでしょうか?

なぜ私がこのようなことをしたいのか疑問に思っている人のために、より長い例を次に示します。

#Acts as a template for aInstance. I would have several aInstances that have common rules, which are defined by an instance of the aDefinition class (though I'd have multiple rule sets too)
class aDefinitionClass: 
    def setInput(self, val):
        self.inputStr = val
    def checkInputByLength(self):
        return len(self.inputStr) < 5
    def checkInputByCase(self):
        return self.inputStr == self.inputStr.upper()
    checkInput = checkInputByLength


class aInstance(aDefinition):
    inputStr = ""
    def __init__(self, ruleDefinition):
        self.checkInput = ruleDefinition.checkInput


aDef = aDefinitionClass()
aDef.checkInput = aDef.checkInputByCase #Changing one of the rules.
aInst = aInstance(aDef)
aInst.setInput("ABC")
aInst.checkInput()
  AttributeError: aDefinitionClass instance has no attribute 'inputStr'

少し変わっていることはわかっていますが、別の方法は考えられませんでした。インスタンスを効果的にサブクラス化しようとしています。Python で許可されている場合、次のようになります。

class aInstance(aDef):
    inputStr = ""
4

2 に答える 2

2

メソッドの記述子を使用して、バインドされたメソッドを取得できます。

instOfA.printSelf = b.printSelf.__get__(instOfA)

もちろん、__class__instOfB のタイプがわからない場合は使用できます。

instOfA.printSelf = instOfB.__class__.printSelf.__get__(instOfA)

instOfAメソッドを保存する必要がない場合は、 aasのインスタンスを渡すだけselfです。

instOfB.printSelf.__func__(instOfA)
于 2010-01-25T03:01:30.463 に答える
0

問題は、メソッドinstOfB.printSelfがバインドされていることです。オブジェクトを作成すると、変数は instOfB に設定されます。率直に言って、関数を少し異なる方法で設定するだけです。self

class b:
    def printSelf(self, other):
        print other

次に、あなたは単に

instOfA = a()
instOfB = b()
instOfA.printSelf = instOfB.printSelf
instOfA.printSelf(instOfA)

そして、instOfB でそれを行いたい場合:

instOfB.printSelf(instOfB)

その方法は少し醜いですが、ブライアンのソリューションよりも少しクリーンで明白です (これも問題なく動作します)。

編集:

さらに良い方法は、記述子を使用することです (ただし、これにはまだコードを変更する必要があります)。

class b:
    @staticmethod
    def printSelf(self):
        print self

ただし、関数を呼び出すときにオブジェクトのインスタンスを含める必要があります。

于 2010-01-25T04:18:35.277 に答える