給定一個模塊module
和類MyClass
,如何獲得module
中定義的MyClass
的所有子類的列表?如何獲取模塊定義的所有子類(特定類)?
回答
您可以使用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))
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
不漂亮,但工程。儘管替代品是受歡迎的...
我嘗試:
>>> 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'>]
不錯,簡潔 - 儘管你需要添加一個'和issubclass(x,myClass)'來回復聲明 - 我應該提出問題標題與身體一致,對此感到抱歉 –
也許嘗試pyclbr模塊 - Python類瀏覽器支持
您可否詳細說明這一點?雖然根據另外兩個簡短的答案,這可能是矯枉過正的... –
...雖然這可能會在另一個環境中變得有用,但是感謝鏈接 –
只是試圖指向一個現有的解決方案(取決於情境可能是一種矯枉過正,我同意,我只是傾向於嘗試不重新創建)。它默認提供更多的選項(方法,行),並從src本身獲取所有選項。 – brunod
- 1. 如何獲取所有類別的所有帖子自定義帖子類型?
- 2. 如何獲取爲特定模型類定義的所有factory_girl工廠?
- 3. 獲取模塊ruby中定義的所有類
- 4. 如何確定模塊特定的異常類定義
- 5. 獲取具有特定類別的所有子元素的ID
- 6. 如何獲取某個類別中所有帖子的特定自定義字段的所有元值?
- 7. 獲取所有特定產品類型
- 8. 如何通過ldap中的特定對象類獲取所有屬性定義?
- 9. 獲取從特定的類派生的類模塊
- 10. 如何獲取在模塊中定義的所有優化?
- 11. 如何獲取特定的DLL中的所有類,瀏覽OpenFileDialog
- 12. 獲取特定類別下的所有Schema.org模式(Place,LocalBusiness)
- 13. 如何在SPARQL中獲取特定類的子類的標籤
- 14. 如何獲取列表中特定類型的所有對象?
- 15. 如何獲取特定類型的所有記錄?
- 16. Qt:如何獲得特定類的兒童的所有類
- 17. 從Wordpress中的自定義分類中獲取所有帖子
- 18. 如何獲取特定父類別的子類別?
- 19. Magento 1.9:如何獲取特定類別的子類別?
- 20. 如何在Flask中獲取特定父類別的子類別?
- 21. 如何從兩個自定義帖子類型中獲取所有帖子?
- 22. 獲取所有定義的父類的類在PHP
- 23. 如何獲取自定義帖子類型的類別?
- 24. wp類別顯示所有類別的所有帖子,而不是來自特定類別的特定帖子
- 25. 如何從選定的UITableViewCell獲取自定義的NSManagedObject子類
- 26. 從自定義類獲取特定類型的屬性
- 27. 如何使用npm模塊的自定義類型定義?
- 28. 定義類型和模塊時重複的類型或模塊的定義
- 29. 模塊沒有定義屬性/類
- 30. 梨模塊類沒有定義
更好地使用'inspect.isclass(對象)'和更好還沒有影子的內置'object'。例如'inspect.getmembers(unittest,lambda o:inspect.isclass(o)和issubclass(o,unittest.TestCase))' – Duncan
@Duncan謝謝你,沒錯。 – alecxe
我可以發誓'issubclass(o,A)'在我以前的測試中不起作用,這就是爲什麼我用'A in o .__ mro__'代替。不能重現,但...感謝您的答案! –