4

簡単なはずですが、どういうわけかわかりません。与えられた関数を適用したい。背景は、クラスをコピーし、新しく作成されたコピーに特定のメソッドを適用することです。

メジャー編集。そのために残念。

   import copy
   class A:

       def foo(self,funcName):
           print 'foo'
           funcName()

       def Bar(self):
           print 'Bar'

        def copyApply(self,funcName):
           cpy = copy.copy()
           # apply funcName to cpy??

    a = A()
    func = a.Bar()
    a.foo(func) # output 'Bar'
    b = a.copyApply(foo) # new copy with applied foo
4

2 に答える 2

4

A.fooは関数の名前ではなく、関数自体であることに注意してください。

class A:
   def bar(self):
       print 'Bar'

   def apply(self, func):
       func()  # call it like any other function

   def copyApply(self, func):
       cpy = copy.copy(self)
       func(cpy)  # cpy becomes the self parameter

a = A()
func = a.bar  # don't call the function yet

a.apply(func)       # call the bound method `a.bar`
a.apply(a.bar)      # same as the line above
a.copyApply(A.bar)  # call the unbound method `A.bar` on a new `A`

Pythonでは、はとa.foo()同じです。A.foo(a)ここaで、はタイプAです。したがって、copyApplyメソッドは非バインドのバーメソッドを引数として取りfooますが、バインドされたメソッドを取ります。

于 2012-10-27T21:28:35.803 に答える
1

インスタンスのコピーでメソッドを呼び出したい場合

class A (object):
    def foo(self):
        pass

    def copyApply(self,func):
        cpy = copy.copy(self)
        func(cpy)

そしてそれをそのように呼ぶ

a = A()
a.copyApply(A.foo) 

のインスタンスを最初の引数として期待し、引数をとらないfooので、インスタンスではなくクラスからメソッドを取得していることに注意してください。A.fooAa.foo

于 2012-10-27T21:35:05.243 に答える