파이썬에서 메소드를 매개 변수로 전달하는 방법


191

메소드를 메소드에 매개 변수로 전달할 수 있습니까?

self.method2(self.method1)

def method1(self):
    return 'hello world'

def method2(self, methodToRun):
    result = methodToRun.call()
    return result

답변:


263

예, 당신이 작성한 것처럼 메소드의 이름을 사용하십시오. 메소드 / 함수는 파이썬의 객체이며 다른 것과 마찬가지로 변수를 수행하는 방식으로 전달할 수 있습니다. 실제로, 메소드 (또는 함수)는 값이 실제 호출 가능한 코드 객체 인 변수로 생각할 수 있습니다.

참고로, call메소드 가 없습니다 -라고 생각 __call__하지만 명시 적으로 호출 할 필요는 없습니다.

def method1():
    return 'hello world'

def method2(methodToRun):
    result = methodToRun()
    return result

method2(method1)

method1인수로 불려지 기를 원한다면 상황이 조금 더 복잡해집니다. method2에 인수를 전달하는 방법에 대한 약간의 정보로 작성 method1해야하며, 어딘가에서 해당 인수에 대한 값을 가져와야합니다. 예를 들어 if method1는 하나의 인수를 취해야합니다.

def method1(spam):
    return 'hello ' + str(spam)

그런 다음 method2전달되는 하나의 인수로 호출 할 수 있습니다 .

def method2(methodToRun, spam_value):
    return methodToRun(spam_value)

또는 스스로 계산한다는 주장으로 :

def method2(methodToRun):
    spam_value = compute_some_value()
    return methodToRun(spam_value)

전달 된 값과 계산 된 값의 다른 조합으로이를 확장 할 수 있습니다.

def method1(spam, ham):
    return 'hello ' + str(spam) + ' and ' + str(ham)

def method2(methodToRun, ham_value):
    spam_value = compute_some_value()
    return methodToRun(spam_value, ham_value)

또는 키워드 인수로도

def method2(methodToRun, ham_value):
    spam_value = compute_some_value()
    return methodToRun(spam_value, ham=ham_value)

글을 쓸 때 method2어떤 인수 methodToRun를 취할지 모르는 경우 인수 풀기를 사용하여 일반적인 방식으로 호출 할 수도 있습니다.

def method1(spam, ham):
    return 'hello ' + str(spam) + ' and ' + str(ham)

def method2(methodToRun, positional_arguments, keyword_arguments):
    return methodToRun(*positional_arguments, **keyword_arguments)

method2(method1, ['spam'], {'ham': 'ham'})

이 경우 positional_arguments목록 또는 튜플 또는 유사해야 keyword_arguments하며 dict 또는 유사합니다. 에서을 호출하기 전에 method2수정 positional_arguments하고 keyword_arguments(예 : 특정 인수를 추가 또는 제거하거나 값을 변경) 할 수 있습니다 method1.


34

네 가능합니다. 그냥 전화 해

class Foo(object):
    def method1(self):
        pass
    def method2(self, method):
        return method()

foo = Foo()
foo.method2(foo.method1)

1
인스턴스가 없으면 foo어떻게합니까?
레이 양

1
그러면 foo가 필요하지 않습니다. 예 : def method1(): pass def method2(method) return method() method2(method1)
Tom

14

다음은 독립 실행 형 예제를 보여주기 위해 다시 작성된 예제입니다.

class Test:
    def method1(self):
        return 'hello world'

    def method2(self, methodToRun):
        result = methodToRun()
        return result

    def method3(self):
        return self.method2(self.method1)

test = Test()

print test.method3()

6

예; 함수 (및 메소드)는 Python의 첫 번째 클래스 객체입니다. 다음과 같이 작동합니다.

def foo(f):
    print "Running parameter f()."
    f()

def bar():
    print "In bar()."

foo(bar)

출력 :

Running parameter f().
In bar().

이러한 종류의 질문은 Python 인터프리터 또는 더 많은 기능을 위해 IPython 쉘을 사용하여 대답하기가 쉽지 않습니다.


5

클래스의 메소드를 인수로 전달하려고하지만 아직 호출 할 오브젝트가없는 경우, 첫 번째 인수 (예 : "self")로 오브젝트를 전달하면됩니다. 논의).

class FooBar:

    def __init__(self, prefix):
        self.prefix = prefix

    def foo(self, name):
        print "%s %s" % (self.prefix, name)


def bar(some_method):
    foobar = FooBar("Hello")
    some_method(foobar, "World")

bar(FooBar.foo)

"Hello World"가 인쇄됩니다.


5

좋은 답변은 많지만 아무도 lambda함수를 사용하여 언급하지 않은 것이 이상합니다 .
따라서 논쟁이 없다면 사소한 일이됩니다.

def method1():
    return 'hello world'

def method2(methodToRun):
    result = methodToRun()
    return result

method2(method1)

그러나 하나 이상의 주장이 있다고 가정 해보십시오 method1.

def method1(param):
    return 'hello ' + str(param)

def method2(methodToRun):
    result = methodToRun()
    return result

그럼 당신은 간단하게 호출 할 수 있습니다 method2method2(lambda: method1('world')).

method2(lambda: method1('world'))
>>> hello world
method2(lambda: method1('reader'))
>>> hello reader

여기에 언급 된 다른 답변보다 훨씬 깨끗합니다.


이것이 사전의 값이라면 함수 객체를 반환하는 대신 어떻게 실행할 수 있습니까? 편집 : 방금 ()반환 통화에서 객체 끝에 넣을 수 있음을 깨달았습니다 .
vaponteblizzard

3

메소드는 다른 것과 같은 객체입니다. 그래서 당신은 그들을 전달하고, 목록과 dicts에 저장하고, 당신이 좋아하는 것을 할 수 있습니다. 그들에 대한 특별한 것은 호출 가능한 객체이므로 호출 할 수 __call__있습니다. __call__인수가 있거나없는 메소드를 호출 할 때 자동으로 호출되므로 그냥 작성하면 methodToRun()됩니다.


0

정확히 원하는 것은 아니지만 관련 유용한 도구는 getattr()메소드 이름을 매개 변수로 사용하는 것입니다.

class MyClass:
   def __init__(self):
      pass
   def MyMethod(self):
      print("Method ran")

# Create an object
object = MyClass()
# Get all the methods of a class
method_list = [func for func in dir(MyClass) if callable(getattr(MyClass, func))]
# You can use any of the methods in method_list
# "MyMethod" is the one we want to use right now

# This is the same as running "object.MyMethod()"
getattr(object,'MyMethod')()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.