Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中将函数作为参数传递给类_Python_Oop - Fatal编程技术网

如何在python中将函数作为参数传递给类

如何在python中将函数作为参数传递给类,python,oop,Python,Oop,我想在初始化类时将函数传递给它。下面是我想出的一个玩具示例,它是有效的: def addition(self): return self.a + self.b def multiplication(self): return self.a * self.b class Test: def __init__(self, a, b, fcn): self.a = a self.b = b self.fcn =

我想在初始化类时将函数传递给它。下面是我想出的一个玩具示例,它是有效的:

def addition(self):
        return self.a + self.b


def multiplication(self):
    return self.a * self.b


class Test:

    def __init__(self, a, b, fcn):
        self.a = a
        self.b = b
        self.fcn = fcn

t = Test(3, 3, addition)

print t.fcn(t)

t = Test(3, 3, multiplication)

print t.fcn(t)
是否可以像调用其他类方法一样调用
t.fcn()

答案是肯定的

def do_op(x,y,fn):
   return fn(x,y)

def add(a,b):
   return a+b

print do_op(5,4,add)
一节课也一样

class whatever:
      def __init__(self,fn):
         self.fn = fn
      def do_it(self,*args,**kwargs):
         return self.fn(*args,**kwargs)
         #if you wanted the fn to have self as the first argument
         #return self.fn(self,*args,**kwargs) #just pass self as first argument

x = whatever(add)
print x.do_it(5,8)
进一步了解你的要求(如果我没有看错的话)

或者你想要像这样的东西

from functools import partial
def add(self):
   return self.a + self.b
class whatever:
      def __init__(self,fn,a,b):
         self.__dict__[fn.__name__] = partial(fn,self)
         self.a,self.b = a,b

x = whatever(add,5,6)
x.add()
这种自省在部署的代码中有点危险…

您尝试过吗

答案是肯定的

def do_op(x,y,fn):
   return fn(x,y)

def add(a,b):
   return a+b

print do_op(5,4,add)
一节课也一样

class whatever:
      def __init__(self,fn):
         self.fn = fn
      def do_it(self,*args,**kwargs):
         return self.fn(*args,**kwargs)
         #if you wanted the fn to have self as the first argument
         #return self.fn(self,*args,**kwargs) #just pass self as first argument

x = whatever(add)
print x.do_it(5,8)
进一步了解你的要求(如果我没有看错的话)

或者你想要像这样的东西

from functools import partial
def add(self):
   return self.a + self.b
class whatever:
      def __init__(self,fn,a,b):
         self.__dict__[fn.__name__] = partial(fn,self)
         self.a,self.b = a,b

x = whatever(add,5,6)
x.add()
这种自省在部署的代码中有点危险…

您尝试过吗

答案是肯定的

def do_op(x,y,fn):
   return fn(x,y)

def add(a,b):
   return a+b

print do_op(5,4,add)
一节课也一样

class whatever:
      def __init__(self,fn):
         self.fn = fn
      def do_it(self,*args,**kwargs):
         return self.fn(*args,**kwargs)
         #if you wanted the fn to have self as the first argument
         #return self.fn(self,*args,**kwargs) #just pass self as first argument

x = whatever(add)
print x.do_it(5,8)
进一步了解你的要求(如果我没有看错的话)

或者你想要像这样的东西

from functools import partial
def add(self):
   return self.a + self.b
class whatever:
      def __init__(self,fn,a,b):
         self.__dict__[fn.__name__] = partial(fn,self)
         self.a,self.b = a,b

x = whatever(add,5,6)
x.add()
这种自省在部署的代码中有点危险…

您尝试过吗

答案是肯定的

def do_op(x,y,fn):
   return fn(x,y)

def add(a,b):
   return a+b

print do_op(5,4,add)
一节课也一样

class whatever:
      def __init__(self,fn):
         self.fn = fn
      def do_it(self,*args,**kwargs):
         return self.fn(*args,**kwargs)
         #if you wanted the fn to have self as the first argument
         #return self.fn(self,*args,**kwargs) #just pass self as first argument

x = whatever(add)
print x.do_it(5,8)
进一步了解你的要求(如果我没有看错的话)

或者你想要像这样的东西

from functools import partial
def add(self):
   return self.a + self.b
class whatever:
      def __init__(self,fn,a,b):
         self.__dict__[fn.__name__] = partial(fn,self)
         self.a,self.b = a,b

x = whatever(add,5,6)
x.add()


这种自省在部署的代码中有点冒险…

我不明白。为什么是-1?这是一个问题!我找到了答案。这不是重点吗?我猜-1是因为这是一个容易测试的答案。把它放进你的终端,你会发现是的,这是可能的。@想象一下:如果你把它放进终端,你会发现
t.fcn()
抛出一个错误。那是因为他没有正确调用它。如果t.fcn是print,那么它就可以了,或者如果他调用t.fcn(3,3),那么它也可以。但我明白你的意思,我不明白。为什么是-1?这是一个问题!我找到了答案。这不是重点吗?我猜-1是因为这是一个容易测试的答案。把它放进你的终端,你会发现是的,这是可能的。@想象一下:如果你把它放进终端,你会发现
t.fcn()
抛出一个错误。那是因为他没有正确调用它。如果t.fcn是print,那么它就可以了,或者如果他调用t.fcn(3,3),那么它也可以。但我明白你的意思,我不明白。为什么是-1?这是一个问题!我找到了答案。这不是重点吗?我猜-1是因为这是一个容易测试的答案。把它放进你的终端,你会发现是的,这是可能的。@想象一下:如果你把它放进终端,你会发现
t.fcn()
抛出一个错误。那是因为他没有正确调用它。如果t.fcn是print,那么它就可以了,或者如果他调用t.fcn(3,3),那么它也可以。但我明白你的意思,我不明白。为什么是-1?这是一个问题!我找到了答案。这不是重点吗?我猜-1是因为这是一个容易测试的答案。把它放进你的终端,你会发现是的,这是可能的。@想象一下:如果你把它放进终端,你会发现
t.fcn()
抛出一个错误。那是因为他没有正确调用它。如果t.fcn是print,那么它就可以了,或者如果他调用t.fcn(3,3),那么它也可以。但我明白你的意思。如果你这样做,函数就不能访问
self
。@user2357112是的。。。但这不是问题的一部分。。。如果您愿意,您当然可以将其self作为第一个参数…@JoranBeasley:但是您正处于OP已经拥有的示例代码的情况下。@Chet这是您想要的最后一个示例吗?如果您这样做,函数将无法访问
self
。@user2357112是。。。但这不是问题的一部分。。。如果您愿意,您当然可以将其self作为第一个参数…@JoranBeasley:但是您正处于OP已经拥有的示例代码的情况下。@Chet这是您想要的最后一个示例吗?如果您这样做,函数将无法访问
self
。@user2357112是。。。但这不是问题的一部分。。。如果您愿意,您当然可以将其self作为第一个参数…@JoranBeasley:但是您正处于OP已经拥有的示例代码的情况下。@Chet这是您想要的最后一个示例吗?如果您这样做,函数将无法访问
self
。@user2357112是。。。但这不是问题的一部分。。。如果您愿意,您当然可以将其自身作为第一个参数…@JoranBeasley:但是您正处于OP已经拥有的示例代码的情况下。@Chet这是您想要的最后一个示例吗?