프로그래머가 던져 버릴 수도있는 장애물에도 불구하고 Python 인스턴스를 절대적으로 검사 할 방법이 있는지 궁금합니다. 의도하지 않은 참조 루프 및 열린 리소스와 같은 문제를 디버깅하는 데 도움이 될 수 있기 때문입니다. 파일.클래스에 __dict__ 변수가 있으면 obj .__ dict__를 검사 할 수 있습니까?
더 간단한 예제는 프로그래머가 자신의 클래스 뒤에 keys()
을 숨겨둔 경우 dict
서브 클래스의 키를 어떻게 볼 수 있습니까? 그 주위에 방법은 수동으로 대신 상속 메소드의 서브 클래스의 버전을 불러올 수 있습니다의 dict
keys()
메소드를 호출하는 것입니다 : 내가 상관없이, 인스턴스의 __dict__
볼 수있는 방법,
# Simple example of getting to the real info
# about an instance
class KeyHidingDict(dict):
def keys(self):
return [] # there are no keys here!
khd = KeyHidingDict(a=1, b=2, c=3)
khd.keys() # drat, returns []
dict.keys(khd) # aha! returns ['a', 'b', 'c']
이제 내 실제 질문은 무엇 프로그래머가 나 한테 숨길 수 있었을거야? 그들이 __dict__
클래스 변수를 설정하면 그 클래스에서 상속 물건의 실제 __dict__
그림자 같다 :
# My actual question
class DunderDictHider(object):
__dict__ = {'fake': 'dict'}
ddh = DunderDictHider()
ddh.a = 1
ddh.b = 2
print ddh.a # prints out 1
print ddh.__dict__ # drat, prints {'fake': 'dict'}
당신이 볼 실제 속성을 설정하고 점점 방해 할 수 __dict__
에 대한이 거짓 값은하지 않습니다 그러나 a
및 b
을 숨기고 fake
을 개체의 인스턴스 변수로 표시하여 오디 쉬 코드 dir()
을 오도 할 수 있습니다.
내 목표는 클래스 인스턴스 집합이 너무 많은 메모리를 차지하거나 많은 파일을 열어 놓은 이유에 대해 궁금해 할 때 클래스 인스턴스를 "내 정보"로 볼 수있게 해주는 도구를 작성하는 것입니다. 위의 상황이 극도로 고안되었지만 주위를 둘러싼 방법을 찾으면 도구의 모든 작업 시간이 "보고있는 수업에 이상이없는 한 위대한 작품"이라고하는 대신 항상 작업 할 수 있습니다.
나는 포위 하듯이 같은으로 __dict__
을 잡을 수있을 것이라고 생각했다 :
dict_descr = object.__dict__['__dict__']
print dict_descr(ddh, DunderDictHider)
그러나 object
에는 __dict__
설명자가 없음이 밝혀졌습니다. 대신, subtype_dict()
C 함수는 프로그래머가 생성하는 object
의 각 하위 클래스에 개별적으로 첨부 된 것처럼 보입니다. 디스크립터를 이름을 지정하거나 가져올 수있는 중심적인 방법이 없으므로 클래스를 숨기는 객체에 수동으로 적용 할 수 있습니다.
의견이 있으십니까? :)
추가 생각해 주셔서 감사합니다. 따라서 상속 계층 구조'object' →'A' →'B'에서 객체 B가 인스턴스의'__dict__' 속성을 숨기는 경우에 한 가지 방법이 있습니다. 그러나 오해의 소지가있는'__dict__' 클래스 속성을 정의하는 클래스 'A'라면 당신의 생각이 도움이되지 않는다는 점을 고치고 있습니까? –