Clint's answer의 부록, 당신은 contextlib.contextmanager
사용 PackageResource
를 단순화 할 수 있습니다으로 : 아마 파이썬, 당신은 Package.__new__
대체 할 수 있지만, 다른 방법으로
@contextlib.contextmanager
def packageResource():
class Package:
...
package = Package()
yield package
package.cleanup()
을 :
class Package(object):
def __new__(cls, *args, **kwargs):
@contextlib.contextmanager
def packageResource():
# adapt arguments if superclass takes some!
package = super(Package, cls).__new__(cls)
package.__init__(*args, **kwargs)
yield package
package.cleanup()
def __init__(self, *args, **kwargs):
...
및 단순히 with Package(...) as package
을 사용하십시오.
는 것을 짧아 당신의 정리 기능
close
이름을 지정하고 그
__new__
간단한
class Package(object):
def __new__(cls, *args, **kwargs):
package = super(Package, cls).__new__(cls)
package.__init__(*args, **kwargs)
return contextlib.closing(package)
에 with contextlib.closing(Package(...))
를 통해 수정되지 않은 Package
클래스를 사용하거나 오버라이드 (override) 할 수 있습니다이 경우 contextlib.closing
을, 사용이 생성자는 상속하려면 , 그래서 당신은 단순히 상속받을 수 있습니다.
# package.py
import atexit
import os
class Package:
def __init__(self):
self.files = []
atexit.register(self.cleanup)
def cleanup(self):
print("Running cleanup...")
for file in self.files:
print("Unlinking file: {}".format(file))
# os.unlink(file)
하지만 당신은 파이썬이 종료 될 때까지이 Package
의 생성 된 모든 인스턴스를 유지 것이라는 점을 명심해야합니다
class SubPackage(Package):
def close(self):
pass
링크 된 것을 읽는다면 전역 변수가 사라지는 것은 프로그램이 종료 될 때 이야기하지 않는 한 여기에 적용되지 않는 것 같습니다. 그 동안 내가 링크 한 것에 따라 추측 할 수 있습니다. os 모듈 자체는 벌써 갔다. 그렇지 않으면 __del __() 메서드의 멤버 변수에 적용되지 않는다고 생각합니다. –
예외는 프로그램이 종료되기 전에 오래 버려집니다. AttributeError 예외는 Python이 self.files를 Package의 속성으로 인식하지 않는다는 것을 나타냅니다. 내가 잘못 될 수 있습니다. 그러나 "전역 변수"에 의해 변수에 대한 전역 변수가 메서드에 대해 (그러나 클래스에 로컬 일 수도 있음) 의미하지 않는다면이 예외의 원인을 모릅니다. Google 힌트 Python은 __del __ (self)가 호출되기 전에 구성원 데이터를 정리할 권한을 보유합니다. – wilhelmtell
게시 된 코드가 나를 위해 작동하는 것 같습니다 (Python 2.5). 오류가있는 실제 코드를 게시 할 수 있습니까? 아니면 단순화 된 것입니까? (오류가 더 좋은 버전 일수록 더 간단합니다.) – Silverfish