Передать метод в качестве параметра на python - PullRequest
0 голосов
/ 29 ноября 2018

Могу ли я передать метод в качестве параметра на python?Я хочу сделать такие вещи, как, например, если что-то является экземпляром объекта с / имеет метод foo:

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

(Обратите внимание, очевидно, что экземпляр Anything не имеетатрибут 'method', и я получу AttributeError).

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вы, безусловно, можете передать метод в качестве параметра функции в Python.В моем примере ниже я создал класс (MyClass), который имеет два метода: isOdd и filterArray.Я также создал функцию isEven вне MyClass.filterArray принимает два параметра - массив и функцию, которая возвращает True или False - и использует метод, переданный в качестве параметра для фильтрации массива.

Кроме того, вы можете передавать лямбда-функции какпараметр, который похож на создание функции на лету без необходимости писать объявление функции.

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]
0 голосов
/ 29 ноября 2018

Использует 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)()

Он печатает foo для a, затем выдает ошибку для b

Я должен сказать, что ярекомендуем не злоупотреблять этим типом функций, если вам не нужно по каким-то конкретным причинам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...