这是我正在尝试做的一些(简化)代码:
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()时,它将self打印为instOfB。
但是当我调用instOfA.printSelf()时我希望self成为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 = ""
答案 0 :(得分:2)
您可以使用方法的描述符来获取绑定方法:
instOfA.printSelf = b.printSelf.__get__(instOfA)
当然,如果您不知道instOfB的类型,可以使用__class__
:
instOfA.printSelf = instOfB.__class__.printSelf.__get__(instOfA)
如果instOfA
不需要存储方法,您只需将a
的实例作为self
传递:
instOfB.printSelf.__func__(instOfA)
答案 1 :(得分:0)
问题是instOfB.printSelf
是绑定方法 - 创建对象时self
变量设置为instOfB。坦率地说,我要做的只是稍微改变一下这个功能:
class b:
def printSelf(self, other):
print other
然后你就完成了
instOfA = a()
instOfB = b()
instOfA.printSelf = instOfB.printSelf
instOfA.printSelf(instOfA)
如果你想用instOfB做到这一点:
instOfB.printSelf(instOfB)
这种方式稍显丑陋,但它比Brian的解决方案更清晰,更明显(也可以很好地工作)。
修改强>
更好的方法是使用描述符(虽然这仍然需要修改代码):
class b:
@staticmethod
def printSelf(self):
print self
虽然在调用函数时仍需要包含对象的实例。