回答
注意:在下面我假設Python 3.x.對於Python 2.x,請使用new style classes,即編寫class T(object): pass
而不是class T: pass
。
首先,定義一些類:
>>> class T: pass ... >>> class S: pass ... >>> class U(T): pass ...
要獲得的在當前範圍內定義的類的列表,遍歷
globals
(或locals
)和測試他們是否是type
實例使用isinstance
(因此一個類!):>>> [n for n, o in globals().items() if isinstance(o, type)] ['S', 'U', 'T']
使用
issubclass
ŧ Ø限制你搜索到給定類的子類(在這種情況下T
):>>> [n for n, o in globals().items() if isinstance(o, type) and issubclass(o, (T,))] ['U', 'T']
你可能想省略
T
本身:>>> [n for n, o in globals().items() if o != T and isinstance(o, type) and issubclass(o, (T,))] ['U']
要獲得所有課程開始具有一定的字符串,調用
startswith
在類名:>>> [n for n, o in globals().items() if n.startswith('T') and isinstance(o, type)] ['T']
要標誌創建時某些職業,使用class decorator†添加屬性,例如
__flagged__
:>>> def flag(cls): ... cls.__flag__ = 'flagged' ... return cls ... >>> @flag ... class X: pass ... >>> @flag ... class Y: pass ... >>> class Z: pass ...
現在,你可以只選擇那些與
__flag__
屬性歸類:>>> [n for n, o in globals().items() if isinstance(o, type) and hasattr(o, '__flag__')] ['X', 'Y']
&匕首;:由於bobince筆記,類裝飾器是new in Python 2.6。
bobince:是的,它只是在我看來,它不能在2.x工作,因爲我忘了使用新的風格類... – Stephan202 2009-11-20 14:51:10
這一切都看起來很好的Python 2.x ...類裝飾器是新的2.6。 – bobince 2009-11-20 14:53:10
哈,現在看起來我看到了未來,並知道你要評論;) – Stephan202 2009-11-20 14:54:39
您還可以使用元類收集起來的類,因爲它們的定義:
class AllSeeingMetaClass(type):
# This will be a list of all the classes that use us as a metaclass.
the_classes = []
def __new__(meta, classname, bases, classDict):
# Invoked as new classes are defined.
print "Defining %r" % classname
new_class = type.__new__(meta, classname, bases, classDict)
meta.the_classes.append(new_class)
return new_class
class MyBase(object):
# A base class that pulls in our metaclass.
__metaclass__ = AllSeeingMetaClass
class Cat(MyBase):
def __init__(self):
pass
class Dog(MyBase):
def __init__(self):
pass
print AllSeeingMetaClass.the_classes
打印:
Defining 'MyBase'
Defining 'Cat'
Defining 'Dog'
[<class '__main__.MyBase'>, <class '__main__.Cat'>, <class '__main__.Dog'>]
要想從自身內部的類的子類的列表,請使用來自父類的__subclasses__方法。
>>>class Parent(object):
... pass
...
>>>class Child(Parent):
... pass
...
>>>Parent.__subclasses__()
>>>[<class '__main__.Child'>]
不幸的是,這方法的文檔很少。
- 1. 列表中的Python名稱
- 2. 從列表中刪除特定名稱
- 3. 使用特定名稱制作列表
- 4. 獲取magento中根類別的特定/特定類別名稱
- 5. 獲取特定列的列名稱
- 6. Python列表組,名稱
- 7. Python:動態列表名稱
- 8. SQL中特定數據庫中所有表的列名稱
- 9. 從列名中確定表名稱
- 10. 要從表中獲取具有特定值的列名稱
- 11. 如何從列表中獲取特定項目的名稱
- 12. 在'任意列'中查找具有特定值的表名稱
- 13. 在列表中標準化名稱(python)
- 14. 取列名的特定表
- 15. 格式當列有特定的名稱,
- 16. 從分類器中檢索訓練特徵名稱列表
- 17. 包含與名稱的列表子類S4類:按名稱
- 18. 列出excel電子表格的特定工作表名稱
- 19. 如何獲得在列中具有特定值的表名稱列表?
- 20. 在LINQ中選擇特定列作爲特定名稱?
- 21. 滾動到特定的標籤名稱與特定的類
- 22. CSV列表(行,列)到Python變量名稱(名稱,值)
- 23. WooCommerce在列表中添加類名稱
- 24. 在隨機列表中查找特定名稱
- 25. 使用python解析.py文件中的特定命名列表
- 26. 參考使用Python的名稱列表
- 27. 從表中選擇特定的列名
- 28. python類的特殊方法需要特殊名稱嗎?
- 29. 搜索特定名稱標題列
- 30. 在matlab中處理具有特定名稱和擴展名的列表
使用'grep'搜索源代碼有什麼問題?你有所有Python的源代碼。爲什麼不能在這些文件上簡單地使用'grep'? – 2009-11-20 15:56:49