我需要获取模块中所有对象的列表 - 而不是仅列出其名称的列表。所以,例如,我有:
class myClass:
def __init__(self):
# here be code
pass
class thing1(myClass):
def __init__(self):
self.x = 1
class thing2(myClass):
def __init__(self):
self.x = 2
等等。
我想要的是能够在myClass
(thing1
,thing2
)中提供对象列表的内容,我可以从中调用方法/获取属性。我正在尝试做这样的事情:
for myThing in dir(myClass):
print myThing.x
但是dir
函数只给出了类的名称列表,我无法从中获取属性。
我该怎么做?
答案 0 :(得分:19)
如果您在字符串中有属性的名称,则应使用getattr
来获取它。
给定一个模块X,您可以获得所有属性的列表,以及(例如)其类型的列表。
for i in dir(X):
print i," ",type(getattr(X,i))
答案 1 :(得分:7)
如果你真的想要一个类,实例或模块的成员,只需使用vars()
内置:http://docs.python.org/library/functions.html#vars(它的效果与宣传的一样)
如果您希望当前模块的成员来自某个函数或类(其中vars()
将执行错误操作),那么您应该使用globals()
。< / p>
但是,问题中的代码和单词不匹配。你说你希望访问“myClass
内的对象,但是你发布的代码显然正在寻找myClass
的子类而不是它的内容。
为了补充Asterisk的答案,在交互式提示下使用此更多的例子:
>>> class Example:
... def method(): pass
...
>>> class SubExample(Example):
... pass
...
>>> class OverrideExample(Example):
... def method():
... pass
...
>>> globals()
{'OverrideExample': <class '__main__.OverrideExample'>, '__builtins__': <module
'builtins' (built-in)>, 'Example': <class '__main__.Example'>, '__name__': '__ma
in__', '__package__': None, '__doc__': None, 'SubExample': <class '__main__.SubE
xample'>}
>>> Example.__subclasses__()
[<class '__main__.SubExample'>, <class '__main__.OverrideExample'>]
>>> vars(Example)
dict_proxy({'__dict__': <attribute '__dict__' of 'Example' objects>, '__module__
': '__main__', '__weakref__': <attribute '__weakref__' of 'Example' objects>, 'm
ethod': <function method at 0x00BF6F18>, '__doc__': None})
>>> vars(SubExample)
dict_proxy({'__module__': '__main__', '__doc__': None})
>>> vars(OverrideExample)
dict_proxy({'__module__': '__main__', 'method': <function method at 0x00C10030>,
'__doc__': None})
>>> vars(Example())
{}
>>> vars(SubExample())
{}
>>> vars(OverrideExample())
{}
注意模块级别,每个类对象和每个类实例上可见的内容之间的差异。
另请注意,对于给定的类定义,vars()
不会告诉您任何继承的方法。它也不会告诉您通过类实例可用的方法。要正确查看这两者,最好的办法是按照Noufal的建议行走dir()
,为每个属性调用getattr()
。
答案 2 :(得分:1)
我相信locals()
会为您提供所有局部变量及其指向的对象的字典。
您还可以尝试使用eval()
或exec()
函数将名称计算为原始python代码。然后,您可以直接使用dir()
的结果。
答案 3 :(得分:0)
不确定是否有帮助:
class myClass(object):
def init(self):
pass
class thing1(myClass):
def init(self):
self.x = 1
class thing2(myClass):
def init(self):
self.x = 2
myClass.__subclasses__()
[<class '__main__.thing1'>, <class '__main__.thing2'>]
答案 4 :(得分:0)
class myClass(object):
def init(self):
pass
class thing1(myClass):
def __init__(self):
self.x = 1
class thing2(myClass):
def __init__(self):
self.x = 2
print myClass.__subclasses__()
print vars(thing1())
print vars(thing2())
[<class '__main__.thing1'>, <class '__main__.thing2'>]
{'x': 1}
{'x': 2}
答案 5 :(得分:0)
列出模块的一种非常简单的方法是:
from <module> import *
print dir(<module>)