下面是一些(简化的)代码:
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>
当我打电话的时候印刷体(),它将自我打印为代替。
但我想在我打电话的时候让赛尔夫代替我印刷体(),当我打电话的时候代替印刷品()
如果不在类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 = ""
问题是
instOfB.printSelf
是一个绑定方法-创建对象时self
变量被设置为instOfB。坦率地说,我要做的只是将函数设置稍微不同:那你就这么做吧
如果你想用instOfB做这个:
这样做有点难看,但比Brian的解决方案更干净、更明显(效果也不错)。你知道吗
编辑:
更好的方法是使用描述符(尽管这仍然需要修改代码):
但是在调用函数时仍然必须包含对象的实例。你知道吗
您可以使用方法的描述符来获取绑定方法:
当然,如果不知道instOfB的类型,可以使用
__class__
:如果
instOfA
不需要存储的方法,可以将a
的实例作为self
传入:相关问题 更多 >
编程相关推荐