객체의 메소드와 속성의 전체 목록을 얻는 방법?
dir(re.compile(pattern))
패턴을 목록 요소 중 하나로 반환하지 않습니다. 즉, 다음을 반환합니다.
['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']
매뉴얼에 따르면, 그것은 포함되어 있어야합니다
객체의 속성 명, 클래스의 속성 명 및 클래스의 기본 클래스의 속성을 재귀 적으로 나타냅니다.
그것은 또한 말한다
목록이 반드시 완전하지는 않습니다.
전체 목록 을 얻는 방법이 있습니까? 나는 항상 dir이 전체 목록을 반환한다고 가정했지만 분명히 그렇지 않습니다 ...
또한 : 속성 만 나열하는 방법이 있습니까? 아니면 방법 만?
편집 : 이것은 실제로 파이썬의 버그입니다-> 아마 3.0 분기 (그리고 아마도 2.6)에서도 수정되었습니다.
를 들어 전체 속성 목록, 짧은 대답은 : 없음은. 문제는 속성이 실제로 getattr
내장 함수에서 허용되는 인수로 정의된다는 것 입니다. 사용자 __getattr__
가 속성을 갑자기 허용하면서 다시 구현할 수 있으므로 해당 목록을 생성하는 일반적인 방법은 없습니다. 이 dir
함수는 __dict__
속성 의 키 , 즉 __getattr__
메소드가 다시 구현되지 않은 경우 액세스 가능한 모든 속성을 반환합니다 .
두 번째 질문은 실제로 의미가 없습니다. 실제로 메소드는 호출 가능한 속성입니다. 호출 가능한 속성을 필터링 할 수 있으며 inspect
모듈을 사용하여 클래스 메서드, 메서드 또는 함수를 결정합니다.
그렇기 때문에 새로운 __dir__()
방법이 파이썬 2.6에 추가되었습니다
보다:
- http://docs.python.org/whatsnew/2.6.html#other-language-changes (조금 아래로 스크롤)
- http://bugs.python.org/issue1591665
PierreBdR과 Moe의 답변에 대한 실질적인 추가 사항은 다음과 같습니다.
- 파이썬> = 2.6의 경우 새로운 스타일의 클래스 ,
dir()
충분한 것 같다. 들어 이전 스타일 클래스 , 우리는 적어도 무엇을 할 수 표준 모듈 에 추가 : 지원 탭 완료 수행
dir()
을 찾아__class__
그 갈을 다음과__bases__
:# code borrowed from the rlcompleter module # tested under Python 2.6 ( sys.version = '2.6.5 (r265:79063, Apr 16 2010, 13:09:56) \n[GCC 4.4.3]' ) # or: from rlcompleter import get_class_members def get_class_members(klass): ret = dir(klass) if hasattr(klass,'__bases__'): for base in klass.__bases__: ret = ret + get_class_members(base) return ret def uniq( seq ): """ the 'set()' way ( use dict when there's no set ) """ return list(set(seq)) def get_object_attrs( obj ): # code borrowed from the rlcompleter module ( see the code for Completer::attr_matches() ) ret = dir( obj ) ## if "__builtins__" in ret: ## ret.remove("__builtins__") if hasattr( obj, '__class__'): ret.append('__class__') ret.extend( get_class_members(obj.__class__) ) ret = uniq( ret ) return ret
(테스트 코드와 출력은 간결 삭제하지만, 기본적으로 새로운 스타일을 위해 우리가 같은 결과를 갖고있는 것 같다 객체 get_object_attrs()
에 관해서 dir()
, 그리고 이전 스타일 클래스의 메인 또한 dir()
출력은 것 같다 __class__
속성.)
보충하는 것만 :
dir()
는 IS 가장 강력한 / 기본 도구입니다. ( 가장 권장 )의 결과를 처리 하는 방법 을
dir()
제공 하는 것 이외의 솔루션 .dir()
2 단계 속성을 나열하든 그렇지 않든간에 직접 체로 거르는 것이 중요합니다. 때때로 밑줄이있는 내부 변수를 선별하고 싶을 수도
__
있지만 때로는__doc__
doc-string이 필요할 수도 있습니다 .__dir__()
과dir()
동일한 내용을 반환합니다.__dict__
그리고dir()
다릅니다.__dict__
불완전한 내용을 반환합니다.중요 :
__dir__()
어떤 목적 으로든 작성자가 함수, 값 또는 유형으로 덮어 쓸 수있는 경우가 있습니다.예를 들면 다음과 같습니다.
\\...\\torchfun.py in traverse(self, mod, search_attributes) 445 if prefix in traversed_mod_names: 446 continue 447 names = dir(m) 448 for name in names: 449 obj = getattr(m,name)
TypeError : 객체 설명자
__dir__
에'object'
인수가 필요합니다PyTorch의 저자
__dir__()
는 인수가 필요한 것으로 메소드를 수정했습니다 . 이 수정은dir()
실패합니다.당신이 원하는 경우 신뢰할 수있는 체계가 객체의 모든 속성을 통과하는 모든 파이썬 표준이 있음을 기억하고 오버라이드 (override) 할 수 있고 유지하지 않을 수 있습니다 , 모든 규칙은 신뢰할 수 있습니다.
이것이 내가하는 방법이며, 속성을 계속 추가하는 간단한 사용자 정의 객체에 유용합니다.
으로 obj = type("Obj",(object,),{})
또는 단순히 다음 과 같이 생성 된 객체가 제공됩니다 .
class Obj: pass
obj = Obj()
몇 가지 속성을 추가하십시오.
obj.name = 'gary'
obj.age = 32
그런 다음 사용자 정의 속성 만있는 사전을 얻으려면 다음을 수행하십시오.
{key: value for key, value in obj.__dict__.items() if not key.startswith("__")}
# {'name': 'gary', 'age': 32}
'IT story' 카테고리의 다른 글
Swift 배열 할당이 일치하지 않는 이유가 있습니까 (참조 또는 딥 카피)? (0) | 2020.04.26 |
---|---|
.NET의 API 주요 변경 사항에 대한 결정적인 가이드 (0) | 2020.04.26 |
Javascript 악명 높은 루프 문제? (0) | 2020.04.26 |
템플릿 템플릿 매개 변수의 용도는 무엇입니까? (0) | 2020.04.25 |
텍스트 파일에 유니 코드 텍스트를 작성 하시겠습니까? (0) | 2020.04.25 |