我的代码中包含以下两行: -
instanceMethod = new.instancemethod(testFunc, None, TestCase)
setattr(TestCase, testName, instanceMethod)
如何在不使用“新”模块的情况下重写?我确定新的样式类为此提供了某种解决方法,但我不确定如何。
答案 0 :(得分:10)
有一个讨论表明在python 3中,这不是必需的。同样适用于Python 2.6
请参阅:
>>> class C: pass
...
>>> c=C()
>>> def f(self): pass
...
>>> c.f = f.__get__(c, C)
>>> c.f
<bound method C.f of <__main__.C instance at 0x10042efc8>>
>>> c.f
<unbound method C.f>
>>>
重申每个人的利益,包括我的利益。
Python3中是否有替换new.instancemethod?也就是说,给定一个任意实例(不是它的类),我如何添加一个新的适当定义的函数作为它的方法?
所以关注就足够了:
TestCase.testFunc = testFunc.__get__(None, TestCase)
答案 1 :(得分:4)
您可以将“new.instancemethod”替换为“types.MethodType”:
from types import MethodType as instancemethod
class Foo:
def __init__(self):
print 'I am ', id(self)
def bar(self):
print 'hi', id(self)
foo = Foo() # prints 'I am <instance id>'
mm = instancemethod(bar, foo) # automatically uses foo.__class__
mm() # prints 'I have been bound to <same instance id>'
foo.mm # traceback because no 'field' created in foo to hold ref to mm
foo.mm = mm # create ref to bound method in foo
foo.mm() # prints 'I have been bound to <same instance id>'
答案 2 :(得分:2)
选中此thread(已更新:原始网站已删除)。
答案 3 :(得分:1)
这将做同样的事情:
>>> Testcase.testName = testFunc
是的,这真的很简单。
你的行
>>> instanceMethod = new.instancemethod(testFunc, None, TestCase)
在实践中(虽然不是理论上的)是noop。 :)你也可以这样做
>>> instanceMethod = testFunc
事实上,在Python 3中,我很确定它在理论上也是一样的,但是新模块已经消失,所以我无法在实践中测试它。
答案 4 :(得分:0)
要确认自Python v2.4以来根本不需要使用new.instancemthod(),下面是一个如何替换实例方法的示例。它也不需要使用描述符(即使它有效)。
class Ham(object):
def spam(self):
pass
h = Ham()
def fake_spam():
h._spam = True
h.spam = fake_spam
h.spam()
# h._spam should be True now.
便于进行单元测试。