将方法作为参数传递给python

时间:2018-11-28 23:23:47

标签: python class methods

我可以将方法作为参数传递给python吗? 我想做一些事情,例如,如果任何东西都是具有foo方法的对象的实例:

def access_to(class=anything, method="foo"): return class.method

(很明显,Anything实例没有属性“ method”,并且会得到AttributeError)。

2 个答案:

答案 0 :(得分:4)

如果要从字符串参数获取方法,请使用getattr。

class A:
    def foo(self):
        print("foo")

def access_to(c, method="foo"):
     return getattr(c, method)

a = A()
b = 5
access_to(a)()
access_to(b)()

它为a打印foo,然后为b生成错误

我不得不说,除非出于某些特殊原因,否则我不建议滥用此类功能。

答案 1 :(得分:0)

您当然可以将方法作为参数传递给Python中的函数。在下面的示例中,我创建了一个类(MyClass),该类具有两种方法:isOddfilterArray。我还在isEven之外创建了MyClass函数。 filterArray 接受两个参数-一个数组和一个返回TrueFalse的函数-并使用作为参数传递的方法来过滤数组。

此外,您可以将lambda函数作为参数传递,就像在不编写函数声明的情况下动态创建函数一样。

def isEven(num):
    return num % 2 == 0

class MyClass:

    def isOdd(self, num):
        return not isEven(num)

    def filterArray(self, arr, method):
        return [item for item in arr if method(item)]

myArr = list(range(10))  # [0, 1, 2, ... 9]

myClass = MyClass()

print(myClass.filterArray(myArr, isEven))
print(myClass.filterArray(myArr, myClass.isOdd))
print(myClass.filterArray(myArr, lambda x: x % 3 == 0))

输出:

[0, 2, 4, 6, 8]
[1, 3, 5, 7, 9]
[0, 3, 6, 9]