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方法将未绑定的bar 方法作为其参数,而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.foo预期的A第一个参数的实例一样,并且a.foo不接受任何参数。

于 2012-10-27T21:35:05.243 回答