[python] 파이썬에서 현재 모듈 내의 모든 클래스 목록을 어떻게 얻을 수 있습니까?

모듈에서 모든 클래스를 추출하는 사람들의 많은 예를 보았습니다. 보통 다음과 같습니다.

# foo.py
class Foo:
    pass

# test.py
import inspect
import foo

for name, obj in inspect.getmembers(foo):
    if inspect.isclass(obj):
        print obj

대박.

그러나 현재 모듈 에서 모든 클래스를 얻는 방법을 찾을 수 없습니다 .

# foo.py
import inspect

class Foo:
    pass

def print_classes():
    for name, obj in inspect.getmembers(???): # what do I do here?
        if inspect.isclass(obj):
            print obj

# test.py
import foo

foo.print_classes()

이것은 아마도 명백한 것이지만, 나는 아무것도 찾을 수 없었습니다. 누구든지 나를 도울 수 있습니까?



답변

이 시도:

import sys
current_module = sys.modules[__name__]

당신의 맥락에서 :

import sys, inspect
def print_classes():
    for name, obj in inspect.getmembers(sys.modules[__name__]):
        if inspect.isclass(obj):
            print(obj)

그리고 더 나은 :

clsmembers = inspect.getmembers(sys.modules[__name__], inspect.isclass)

inspect.getmembers()술어를 취하기 때문에 .


답변

이건 어떤가요

g = globals().copy()
for name, obj in g.iteritems():

?


답변

‘적절한’방법이 있는지는 모르겠지만 스 니펫은 올바른 길을 가고 있습니다 : import foofoo.py에 추가 하고 수행 inspect.getmembers(foo)하면 정상적으로 작동합니다.


답변

dir내장 된 plus 에서 필요한 모든 것을 얻을 수있었습니다 getattr.

# Works on pretty much everything, but be mindful that 
# you get lists of strings back

print dir(myproject)
print dir(myproject.mymodule)
print dir(myproject.mymodule.myfile)
print dir(myproject.mymodule.myfile.myclass)

# But, the string names can be resolved with getattr, (as seen below)

그러나 머리카락처럼 보입니다.

def list_supported_platforms():
    """
        List supported platforms (to match sys.platform)

        @Retirms:
            list str: platform names
    """
    return list(itertools.chain(
        *list(
            # Get the class's constant
            getattr(
                # Get the module's first class, which we wrote
                getattr(
                    # Get the module
                    getattr(platforms, item),
                    dir(
                        getattr(platforms, item)
                    )[0]
                ),
                'SYS_PLATFORMS'
            )
            # For each include in platforms/__init__.py 
            for item in dir(platforms)
            # Ignore magic, ourselves (index.py) and a base class.
            if not item.startswith('__') and item not in ['index', 'base']
        )
    ))


답변

import pyclbr
print(pyclbr.readmodule(__name__).keys())

stdlib의 Python 클래스 브라우저 모듈은 정적 소스 분석을 사용하므로 실제 .py파일 이 지원하는 모듈에서만 작동 합니다.


답변

현재 모듈에 속하는 모든 클래스를 가지려면 다음을 사용할 수 있습니다.

import sys, inspect
def print_classes():
    is_class_member = lambda member: inspect.isclass(member) and member.__module__ == __name__
    clsmembers = inspect.getmembers(sys.modules[__name__], is_class_member)

Nadia의 답변을 사용하고 모듈에서 다른 클래스를 가져 오면 해당 클래스도 가져옵니다.

그래서에 member.__module__ == __name__사용 된 술어에 추가되는 이유 입니다 is_class_member. 이 명령문은 클래스가 실제로 모듈에 속하는지 확인합니다.

술어는 부울 값을 리턴하는 함수 (호출 가능)입니다.


답변

파이썬 2와 3에서 작동하는 또 다른 솔루션입니다.

#foo.py
import sys

class Foo(object):
    pass

def print_classes():
    current_module = sys.modules[__name__]
    for key in dir(current_module):
        if isinstance( getattr(current_module, key), type ):
            print(key)

# test.py
import foo
foo.print_classes()