Python 获取可从模块或任何其他对象访问的所有属性

Python 获取可从模块或任何其他对象访问的所有属性,python,Python,考虑这一点: >>> import math >>> dir(math) ['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'factorial', 'floor', 'fmod',

考虑这一点:

>>> import math
>>> dir(math)
['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'hypot', 'isinf', 'isnan', 'ldexp', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
\uuuu dict\uuuuu
未列出,但我仍可以执行

>>> math.__dict__
同样的事情

>>> class MyClass(object):
         def __init__(self, var1, var2):

             self.a = var1
             self.b = var2

         def __call__(self, arg):

             print " The arg passed is ", arg

>>> dir(MyClass) 

['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
\uuuuuuuuuuuuuuuu
\uuuuuuuuu
未列出,但我仍可以执行以下操作:

>>> MyClass.__bases__
(<type 'object'>,)
>>> MyClass.__base__
<type 'object'>
>>MyClass.\uuu__
(,)
>>>MyClass.\uuuu基__
问题:


我如何知道或提前告诉所有可以从python对象访问的属性?在这种情况下,我如何判断
math
模块有
\uuuu dict\uuuu
MyClass
\uuu base\uuuuu
\uuu base\uuuuuuuu

如果您在寻找完全通用的东西,那么没有办法,因为属性查找是动态的。比如说:

尝试返回该对象的有效属性列表

这里的关键词是“尝试”。下表:

注意:由于提供dir()主要是为了方便在交互提示下使用,因此它尝试提供一组有趣的名称,而不是严格或一致定义的名称,并且其详细行为可能会在不同版本中发生变化。例如,当参数是类时,元类属性不在结果列表中

实际上,它所能做的就是查看对象的
\uuu dict\uuu
、对象的类型以及该类型的任何基类。(然后减去一些内容,例如,跳过类型类型的属性以避免暴露元类属性,而元类属性通常是您不关心的)。如果您想要确切的细节,请阅读上面链接的文档

同时,如果对象具有
\uuuu getattr\uuuuuuuu
/
\uuuu setattr\uuuuuu
/
\uuuu delattr\uuuuuuuuu
,或者上述的
\uu getattribute\uuuuuuuuuuuu
或C-API等价物,那么它可能具有任何字典中都没有的所有类型的属性,甚至可能是无限的属性集。例如:

class C(object):
    def __getattr__(self, name):
        return name
c = C()
print(c.a)
这将打印出
a
。但是
dir
怎么可能知道
c.a
的存在呢?即使它可以解释我的代码,它也必须打印出所有可能字符串的列表,这显然是您不想要的

还有一些特殊的属性名,在解释器的掩护下以奇特的方式进行处理

此外,任何对象都可以定义一个
\uuuu dir\uu
方法来返回它想要的任何内容


如果你想找一些特别的东西,你可能可以这样做。例如,如果您只是尝试在不减去元类属性的情况下获取属性,那么这只是
dir(x)+dir(type(x))
,或者更好的方法是
dir(x)+[a表示in dir(type(x))(如果a不在dir(x))
(删除重复项)


但是如果你想知道一个对象的所有属性,那就不行。

dir(type(MyClass))
将显示它们。元类属性通常对
dir
隐藏。与
Myclass.mro()
相同。顺便说一句,您可以定义自己的
\uuuu dir\uuuuu
方法并返回随机名称,如果您需要…@JBernardo什么是mro()?@JBernardo:
dir(type(Myclass))
将显示从
dir(Myclass)
隐藏的元类属性,但它不是显示
dir
隐藏的所有内容的万能药,只是一种情况。@abc:它代表方法解析顺序。我认为docs一章描述了
\uuu mro\uuu
属性、
mro
方法以及如何计算mro的基础知识。如果您对这些东西感兴趣,请阅读,特别是关于描述符和插槽的部分,然后阅读元类(2.x和3.x中文档的不同部分)。如果你成功了,你将有一个关于Python中大多数“魔力”是如何真正发挥作用的心智模型。