답변:
foo
방법으로 모듈 을 가정 bar
:
import foo
method_to_call = getattr(foo, 'bar')
result = method_to_call()
2 행과 3 행을 다음과 같이 단축 할 수 있습니다.
result = getattr(foo, 'bar')()
사용 사례에 더 적합한 경우
getattr
이런 방식으로 클래스 인스턴스 바운드 메서드, 모듈 수준 메서드, 클래스 메서드 등을 사용할 수 있습니다 . 목록은 계속됩니다.
foo
모듈 당신은 사용할 수 있습니다 globals()
:이 할methodToCall = globals()['bar']
locals()["myfunction"]()
또는
globals()["myfunction"]()
locals 는 현재 로컬 심볼 테이블이있는 사전을 반환합니다. globals 는 전역 기호 테이블이있는 사전을 반환합니다.
패트릭의 해결책은 아마도 가장 깨끗할 것입니다. 동적으로 모듈을 선택해야하는 경우 다음과 같이 가져올 수 있습니다.
module = __import__('foo')
func = getattr(module, 'bar')
func()
importlib.import_module
. 공식 문서는 다음과 같이 말합니다 __import__
. "importlib.import_module ()과 달리 일상적인 파이썬 프로그래밍에는 필요하지 않은 고급 함수입니다." docs.python.org/2/library/functions.html#__import__
importlib.import_module
는 3.6에서 지원됩니다. 참조 docs.python.org/3.6/library/...
간단한 기여. 인스턴스화해야하는 클래스가 동일한 파일에 있으면 다음과 같이 사용할 수 있습니다.
# Get class from globals and create an instance
m = globals()['our_class']()
# Get the function (from the instance) that we need to call
func = getattr(m, 'function_name')
# Call it
func()
예를 들면 다음과 같습니다.
class A:
def __init__(self):
pass
def sampleFunc(self, arg):
print('you called sampleFunc({})'.format(arg))
m = globals()['A']()
func = getattr(m, 'sampleFunc')
func('sample arg')
# Sample, all on one line
getattr(globals()['A'](), 'sampleFunc')('sample arg')
그리고 수업이 아닌 경우 :
def sampleFunc(arg):
print('you called sampleFunc({})'.format(arg))
globals()['sampleFunc']('sample arg')
함수에 대한 완전한 파이썬 경로가있는 문자열이 주어지면이 함수의 결과를 얻는 방법입니다.
import importlib
function_string = 'mypackage.mymodule.myfunc'
mod_name, func_name = function_string.rsplit('.',1)
mod = importlib.import_module(mod_name)
func = getattr(mod, func_name)
result = func()
__import__
기능입니다.
Python 프로그래밍 FAQ 에 따르면 가장 좋은 대답 은 다음과 같습니다.
functions = {'myfoo': foo.bar}
mystring = 'myfoo'
if mystring in functions:
functions[mystring]()
이 기술의 주요 장점은 문자열이 함수 이름과 일치 할 필요가 없다는 것입니다. 이것은 또한 사례 구성을 에뮬레이트하는 데 사용되는 기본 기술입니다
아무도 원치 않는 대답
행동과 같은 평가
getattr(locals().get("foo") or globals().get("foo"), "bar")()
자동 가져 오기를 추가하지 않는 이유
getattr(
locals().get("foo") or
globals().get("foo") or
__import__("foo"),
"bar")()
추가 사전이있는 경우 확인하고 싶습니다.
getattr(next((x for x in (f("foo") for f in
[locals().get, globals().get,
self.__dict__.get, __import__])
if x)),
"bar")()
우리는 더 깊이 가야한다
getattr(next((x for x in (f("foo") for f in
([locals().get, globals().get, self.__dict__.get] +
[d.get for d in (list(dd.values()) for dd in
[locals(),globals(),self.__dict__]
if isinstance(dd,dict))
if isinstance(d,dict)] +
[__import__]))
if x)),
"bar")()
이 시도. 이것은 여전히 eval을 사용하지만 현재 컨텍스트에서 함수 를 소환하는 데만 사용합니다 . 그런 다음 원하는대로 사용할 실제 기능이 있습니다.
이것의 주요 이점은 함수를 소환 할 때 평가 관련 오류가 발생한다는 것입니다. 그럼 당신은 얻을 것이다 단지 당신이 호출 할 때 기능 관련 오류를.
def say_hello(name):
print 'Hello {}!'.format(name)
# get the function by name
method_name = 'say_hello'
method = eval(method_name)
# call it like a regular function later
args = ['friend']
kwargs = {}
method(*args, **kwargs)
eval
꼭 필요한 경우가 아니면 절대 사용 하지 마십시오 . getattr(__module__, method_name)
이 맥락에서 훨씬 더 나은 선택입니다.
제안 된 것 중 어느 것도 나를 도우 지 못했습니다. 나는 이것을 발견했다.
<object>.__getattribute__(<string name>)(<params>)
파이썬 2.66을 사용하고 있습니다
도움이 되었기를 바랍니다
self.__getattribute__('title')
self.title
self.__getattribute__('title')
어쨌든 작동하지 않지만 (이유를 몰라) 결국 func = getattr(self, 'title'); func();
작동합니다. 따라서 getattr()
대신 사용하는 것이 좋습니다.
이 질문 과 같이 중복으로 표시된 변수 [duplicate]에 method-name 할당을 사용하여 클래스 내에서 메소드를 동적으로 호출하는 방법 에 관련 답변을 여기에 게시하고 있습니다.
시나리오는 클래스의 메소드가 동일한 클래스에서 다른 메소드를 동적으로 호출하려는 경우 더 넓은 시나리오와 명확성을 제공하는 원래 예제에 세부 정보를 추가했습니다.
class MyClass:
def __init__(self, i):
self.i = i
def get(self):
func = getattr(MyClass, 'function{}'.format(self.i))
func(self, 12) # This one will work
# self.func(12) # But this does NOT work.
def function1(self, p1):
print('function1: {}'.format(p1))
# do other stuff
def function2(self, p1):
print('function2: {}'.format(p1))
# do other stuff
if __name__ == "__main__":
class1 = MyClass(1)
class1.get()
class2 = MyClass(2)
class2.get()
출력 (Python 3.7.x)
기능 1:12
기능 2:12
이것은 간단한 답변입니다. 예를 들어 화면을 지울 수 있습니다. 아래에는 eval 및 exec의 두 가지 예가 있으며, 청소 후 맨 위에 0을 인쇄하거나 (Windows를 사용하는 경우로 변경 clear
하면 cls
Linux 및 Mac 사용자는 그대로 두십시오) 또는 각각 실행합니다.
eval("os.system(\"clear\")")
exec("os.system(\"clear\")")