2013-09-24 67 views

回答

6

您可以使用inspect.getmembers()。假設你有mymodule.py

class A(object): 
    pass 


class B(A): 
    pass 


class C(A): 
    pass 

這裏是你如何能得到的A所有子類:

import inspect 
import mymodule 
from mymodule import A 

def is_subclass(o): 
    return inspect.isclass(o) and issubclass(o, A) 


print inspect.getmembers(mymodule, predicate=is_subclass) 

,或者在短期lambda形式:

print inspect.getmembers(mymodule, 
         predicate=lambda o: inspect.isclass(o) and \ 
              issubclass(o, A)) 
+3

更好地使用'inspect.isclass(對象)'和更好還沒有影子的內置'object'。例如'inspect.getmembers(unittest,lambda o:inspect.isclass(o)和issubclass(o,unittest.TestCase))' – Duncan

+0

@Duncan謝謝你,沒錯。 – alecxe

+0

我可以發誓'issubclass(o,A)'在我以前的測試中不起作用,這就是爲什麼我用'A in o .__ mro__'代替。不能重現,但...感謝您的答案! –

1
classes =() 
for name in dir(module): 
    obj = getattr(module, name) 
    try: 
     # obj.__mro__ raises AttributeError on non-class 
     if MyClass in obj.__mro__ and obj is not MyClass: 
      classes += (obj,) 
     #else: 
     # print name, "is no subclass of", MyClass 
    except AttributeError: 
     #print name, "is no class" 
     pass # you might of course use an if hasattr(obj, '__mro__') instead 

不漂亮,但工程。儘管替代品是受歡迎的...

1

我嘗試:

>>> def f(module): 
...  things = [getattr(module, x) for x in dir(module)] 
...  return [x for x in things if type(x) == type] 
... 
>>> import datetime 
>>> f(datetime) 
[<type 'datetime.date'>, <type 'datetime.datetime'>, <type 'datetime.time'>, <type 'datetime.timedelta'>, <type 'datetime.tzinfo'>] 
+0

不錯,簡潔 - 儘管你需要添加一個'和issubclass(x,myClass)'來回復聲明 - 我應該提出問題標題與身體一致,對此感到抱歉 –

0

也許嘗試pyclbr模塊 - Python類瀏覽器支持

http://pymotw.com/2/pyclbr/

+0

您可否詳細說明這一點?雖然根據另外兩個簡短的答案,這可能是矯枉過正的... –

+0

...雖然這可能會在另一個環境中變得有用,但是感謝鏈接 –

+0

只是試圖指向一個現有的解決方案(取決於情境可能是一種矯枉過正,我同意,我只是傾向於嘗試不重新創建)。它默認提供更多的選項(方法,行),並從src本身獲取所有選項。 – brunod

相關問題