替换“新”模块

时间:2010-12-06 08:43:28

标签: python python-3.x

我的代码中包含以下两行: -

instanceMethod = new.instancemethod(testFunc, None, TestCase)
setattr(TestCase, testName, instanceMethod)

如何在不使用“新”模块的情况下重写?我确定新的样式类为此提供了某种解决方法,但我不确定如何。

5 个答案:

答案 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)

在实践中(虽然不是理论上的)是no​​op。 :)你也可以这样做

>>> 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.

便于进行单元测试。