나는이 범위 동작에 대한 혼란 스러워요 :이상한 파이썬 기능 범위의 동작
class Bar:
def __init__(self):
for fn in ["open","openW","remove","mkdir","exists","isdir","listdir"]:
print "register", fn
def func_wrapper(filename):
print "called func wrapper", fn, filename
setattr(self, fn, func_wrapper)
bar = Bar()
bar.open("a")
bar.remove("b")
bar.listdir("c")
이 출력 제공 :
register open
register openW
register remove
register mkdir
register exists
register isdir
register listdir
called func wrapper listdir a
called func wrapper listdir b
called func wrapper listdir c
을하지만 func_wrapper
항상 올바른 기능이 될 것이라고 예상했을 것이다. func_wrapper
의 범위가 전체 함수에 있음을 알고 있지만 모든 루프 반복에서이를 재정의하고 마지막 인스턴스가 attrib에서 제외되었습니다. 나도 setattr
아래에 func_wrapper = None
를 더하려고 노력했다. 그러나 그것은 도움이되지 않는다 (또한 나를 궁금하게 생각할 것이다. ..).
내가 장 님? 나는이 문제를 해결하는 방법을 실제로 보지 못했다. 원래 예에서
def mkwrapper(fn):
def func_wrapper(filename):
print "called func wrapper", fn, filename
func_wrapper.__name__ = fn
return func_wrapper
class Bar:
def __init__(self):
for fn in ["open","openW","remove","mkdir","exists","isdir","listdir"]:
print "register", fn
func_wrapper = mkwrapper(fn)
setattr(self, fn, func_wrapper)
더 견고
class Bar:
def __init__(self):
for fn in ["open","openW","remove","mkdir","exists","isdir","listdir"]:
print "register", fn
def func_wrapper(filename, fn=fn):
print "called func wrapper", fn, filename
setattr(self, fn, func_wrapper)
또는 함께
@heltonbiker : 자세히 설명해 주시겠습니까? 여기서 어떻게 사전을 사용해야합니까? 그리고 왜? – Albert
나는 더 철저히 읽고 이전 주석을 삭제했습니다. – heltonbiker