2010-12-06 13 views
6

を交換し、私はそれに次の2行を含むコードがあります: - どのようにそれは「新しい」モジュールを使用せずに「新しい」モジュール

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

を書き換えることができましたか?確かに、新しいスタイルのクラスではこれに対処する方法がいくつか用意されていますが、どうすればよいか分かりません。

答えて

2

これをチェックしてくださいthread(更新:元のサイトは削除されました)。

+0

: ます。http://をpython.6.n6.nabble.com/replacement-for-new-instancemethod-in-Python3-tt1546046.html#none 多くの情報は含まれていませんが、間違っている可能性があります。 – geertjanvdk

+0

申し訳ありませんが、それは私の部分で間違っていた。もう一度投票しました! – geertjanvdk

9

Python 3ではこれは必須ではないという議論があります。鉱山など、一人一人の利益のために質問を改めて表明

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

、:Pythonの2.6で同じ作品

参照

Python3でnew.instancemethodの代わりがありますか?つまり、任意のインスタンス(そのクラスではない)が与えられれば、メソッドとして適切に定義された新しい関数をどのように追加できますか?

ので十分です以下:

TestCase.testFunc = testFunc.__get__(None, TestCase) 
+1

なぜ 'c.f'の値が、' <__ main __。C instance in 0x10042efc8 >> >>のバインドメソッドC.fから対話シェルの2回目のアクセスで ''に変わったのですか?私が試してみると、それは私のためではありません。 – martineau

1

これは、同じことをするでしょう。

>>> Testcase.testName = testFunc 

うん、それは本当に簡単です。

>>> instanceMethod = new.instancemethod(testFunc, None, TestCase) 

あなたのラインは(ではないが、理論的には)NOOP、実際にです。 :)あなただけのようにも実際には

>>> instanceMethod = testFunc 

を行うことができ、Pythonの3で、私はそれは同様に、理論的には同じになるかなり確信しているが、新しいモジュールがそのように消えて、私はそれをテストすることはできません練習。

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. 

単体テスト用ハンディ。

3

あなたが「types.MethodType」で「new.instancemethod」を置き換えることができます。

以前の私は壊れたリンクへの参照を見つけることができませんでしたが、ここではそれがあるとコメントし
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>' 
関連する問題