객체의 메소드와 속성의 전체 목록을 얻는 방법이 있습니까?

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에 추가되었습니다

보다:


답변

다음은 PierreBdR 및 Moe의 답변에 대한 실질적인 추가 사항입니다.

  • Python> = 2.6 및 new-style 클래스의 경우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__속성.)


답변

보충하는 것만 :

  1. dir()는 IS 가장 강력한 / 기본 도구입니다. ( 가장 권장 )
  2. 의 출력을 처리 하는 방법dir()제공 하는 것 이외의 솔루션 .dir()

    2 단계 속성을 나열하든 그렇지 않든간에 직접 체로 거르는 것이 중요합니다. 때때로 밑줄이있는 내부 변수를 선별하고 싶을 수도 __있지만 때로는 __doc__doc-string이 필요할 수도 있습니다 .

  3. __dir__()dir()동일한 내용을 반환합니다.
  4. __dict__그리고 dir()다릅니다. __dict__불완전한 내용을 반환합니다.
  5. 중요 :__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()실패합니다.

  6. 당신이 원하는 경우 신뢰할 수있는 체계가 객체의 모든 속성을 통과하는 모든 파이썬 표준이 있음을 기억하고 오버라이드 (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}