파이썬에서 동적 인 리로딩 객체를 구현하려고합니다. 코드 변경 내용을 반영합니다.파이썬 객체 트리를 가로 질러
모듈 리로딩이 작동하지만 변경 사항이 적용되도록 모듈 클래스의 모든 인스턴스를 다시 만들어야합니다.
문제는 개체 데이터 (개체 __dict__
콘텐츠)가 처리 중에 손실된다는 것입니다.
def refresh(obj, memo=None):
if memo is None:
memo = {}
d = id(obj)
if d in memo:
return
memo[d] = None
try:
obj.__class__ = getattr(sys.modules[obj.__class__.__module__],
obj.__class__.__name__)
except TypeError:
return
for item in obj.__dict__.itervalues():
if isinstance(item, dict):
for k, v in item.iteritems():
refresh(k, memo)
refresh(v, memo)
elif isinstance(item, (list, tuple)):
for v in item:
refresh(v, memo)
else:
refresh(item, memo)
을 그리고 놀랍게도 작동한다! 내 객체에서 refresh()를 호출 한 후 새 코드를 다시 만들지 않고도 효과가 있습니다.
하지만 이것이 올바른 방법으로 객체를 통과하는지 확신 할 수 없습니까? 객체의 컴포넌트를 트래버스하는 더 좋은 방법이 있습니까?
이것은 내가 채택한 솔루션과 매우 비슷합니다 (일부 "최상위 레벨"클래스는 래핑되어 인스턴스를 다시로드 할 수 있도록 추적합니다). 문제는 내 패키지에있는 모든 클래스를 래핑하고 싶지 않다는 것입니다 (또는 예제 에서처럼 클래스를 다시로드하는 것부터 상속받습니다). 최상위 클래스 만 상속합니다. 이것이 객체 트리 트래버스 기능이 필요한 이유입니다. –
나는 당신이 완전한 보편성으로 그것을 할 수 없다고 믿습니다. __slots__ 및 기타 메타 클래스 기능을 사용하는 경우 Python 객체가이를 지원하지 않도록 코딩 될 수 있습니다 (확장 코드, 가비지 콜렉션 탐색, weakrefs, pickling/unpickling 및 & c) 특정 지원이 필요한 이유입니다. 열린 파일, DB 연결, 생성기 개체, 잠금 장치 ... 일부 부품이 누락 될 위험이 있다면 최소한 세트, deques, default_factory defaultdfactory 멤버 등을 커버해야합니다. –
그렇다면 방금 가지고 있습니다. 내 반복 설정에서 더 많은 유형 테스트를 추가하십시오. has_sequence_interface/has_mapping_interface() 함수를 사용하여 객체를 반복 할 수있는 방법을 테스트하는 것이 좋을 것입니다. –