2014-02-06 48 views
-2

這與SO問題有關,解決方案給了我指出的錯誤。AttributeError:'模塊'對象沒有'模塊'屬性

How can I get a list of all classes within current module in Python?

使用來自綠色檢查代碼,這樣回答,我想在我自己的模塊的所有類名的列表,locations.py:

import locations 

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

print_classes() 

當我運行這個,我得到AttributeError的:「模塊」對象沒有屬性「模塊」

我已經測試locations.py - 它包含31骨架類;它不會引發錯誤。

+1

檢查代碼。 –

+0

@KolyolyHorvath - 我以爲我正在適應它來適應我的模塊。 – macloo

回答

3

接受的答案使用sys.moduleslocations.modules

for name, obj in inspect.getmembers(sys.modules[__name__]): 

sys.modules是Python辭典保持所有導入的模塊對象:

This is a dictionary that maps module names to modules which have already been loaded. This can be manipulated to force reloading of modules and other tricks. Note that removing a module from this dictionary is not the same as calling reload() on the corresponding module object.

在你的情況,你不需要sys.modules ,你已經有對模塊對象的引用。已經導入了,所以只用它直接:

for name, obj in inspect.getmembers(locations): 
+0

sys.modules是否提供類名? –

+0

@yopy:'sys.modules'是一個字典。它具有鍵和值,鍵是模塊名稱,值是模塊對象。模塊對象具有屬性;這些是在該模塊中定義的對象。如果其中一個屬性是一個類,那麼**那個類將會有一個名字。 –

+0

好的,謝謝你的解釋。 –

0

您可以修復被更改爲sys.modules['locations']locations

注意:如果你是從同一模塊本身的測試,比你可以使用:sys.modules[__name__]

>>> import locations 
>>> sys.modules['locations'] 
<module 'locations' from 'locations.pyc'> 
>>> locations 
<module 'locations' from 'locations.pyc'> 
>>> 

這裏是我的locations.py模塊

class A(object): pass 
class B(object): pass 
class C(object): pass 
class D(object): pass 

這裏是我的testing.py腳本:

import locations 
import inspect 

def print_classes(): 
    for name, obj in inspect.getmembers(locations): 
     if inspect.isclass(obj): 
      print obj 

print_classes() 

輸出:

<class 'locations.A'> 
<class 'locations.B'> 
<class 'locations.C'> 
<class 'locations.D'> 
+0

這不是引發OP的錯誤的代碼,它是*爲什麼*該問題首先發布。 –

+0

雅我改變了'locations.modules [__ name __]'到位置 –

+0

沒錯,所以你可能想解釋一下有什麼區別,爲什麼你改變了它。 –

0

你可能更喜歡列表理解,因爲循環是相當小的。

from __future__ import print_function 
from inspect import getmembers, isclass 
import my_module 

[print(obj) for obj in getmembers(my_module) if isclass(obj)] 
你不使用綠色
相關問題