私がやろうとしていることの(簡略化された)コードは次のとおりです。
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 = ""