Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取所有可能的类属性的完整列表_Python_Python 3.x_Attributes_Python 2.x - Fatal编程技术网

Python 获取所有可能的类属性的完整列表

Python 获取所有可能的类属性的完整列表,python,python-3.x,attributes,python-2.x,Python,Python 3.x,Attributes,Python 2.x,给定一个简单的类,有没有一种方法可以输出它所有可能的属性?标准属性,如\uuuuu class\uuuuu和\uuuu doc\uuuu和\uuuu mro\uuuuu,\uuuu base\uuuuuu等。一般来说,所有属性都存在吗 考虑一个类最简单的情况: class myClass: pass dir()、vars()和inspect.getmembers()都排除了某些内置属性。最完整的列表是通过使用myClass.\uuuu dir\uuuu(myClass)提供的,该列表在

给定一个简单的类,有没有一种方法可以输出它所有可能的属性?标准属性,如
\uuuuu class\uuuuu
\uuuu doc\uuuu
\uuuu mro\uuuuu
\uuuu base\uuuuuu
等。一般来说,所有属性都存在吗

考虑一个类最简单的情况:

class myClass:
    pass
dir()
vars()
inspect.getmembers()
都排除了某些
内置属性。最完整的列表是通过使用
myClass.\uuuu dir\uuuu(myClass)
提供的,该列表在添加内置属性时,排除了
myClass
的用户定义属性,例如:

In [3]: set(MyClass.__dir__(MyClass)) - set(dir(MyClass))
Out[3]: 
{'__abstractmethods__', '__base__', '__bases__',
 '__basicsize__', '__call__', '__dictoffset__',
 '__flags__', '__instancecheck__', '__itemsize__',
 '__mro__', '__name__', '__prepare__', '__qualname__',
 '__subclasscheck__', '__subclasses__', '__text_signature__',
 '__weakrefoffset__', 'mro'}
根据增加的一个类似问题,这是不可能的。如果目前仍然不可能,那么“隐藏”某些属性(如
\uuuuuu base\uuuuu
(从标准调用到
dir()、vars()&inspect)的基本原理是什么


类似问题:
  • 这是最有可能被标记为重复的,但是,它是旧的,主要是关于
    Python2.x
    。公认的答案是没有办法,但它是在08年提供的。12'中的最新答案建议新样式类使用
    dir()

  • 相似的标题,不同的内容

  • 提供
    dir()
    inspect
    解决方案

  • 再次建议
    dir()

    • 基本上是一种方便的方法,它不应该返回所有内容,它基本上是递归地返回在类及其基的字典中找到的所有内容

      很容易理解:

      def dir(*args):
          ...
          elif isinstance(obj, (types.TypeType, types.ClassType)):
              # Don't look at __class__, as metaclass methods would be confusing.
              return sorted(_classdir(obj))
          ...
      
      def _classdir(klass):
          """Return a set of the accessible attributes of class/type klass.
      
          This includes all attributes of klass and all of the base classes
          recursively.
          """
          names = set()
          ns = getattr(klass, '__dict__', None)
          if ns is not None:
              names.update(ns)
          bases = getattr(klass, '__bases__', None)
          if bases is not None:
              # Note that since we are only interested in the keys, the order
              # we merge classes is unimportant
              for base in bases:
                  names.update(_classdir(base))
          return names
      
      由于每个类基本上都继承自
      对象
      ,您将看到一些dunder方法,因为它们实际上是
      对象
      字典的一部分:

      >>> class A(object):
          pass
      ...
      >>> set(dir(A)) == set(list(object.__dict__) + list(A.__dict__))
      True
      

      那么
      \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

      首先,对象本身是某事物的实例:

      因此,当我们做A时,实际上是在查找A,即
      类型

      >>> list(type.__dict__)
      ['__module__', '__abstractmethods__', '__getattribute__', '__weakrefoffset__', '__dict__', '__lt__', '__init__', '__setattr__', '__subclasses__', '__new__', '__base__', '__mro__', 'mro', '__dictoffset__', '__call__', '__itemsize__', '__ne__', '__instancecheck__', '__subclasscheck__', '__gt__', '__name__', '__eq__', '__basicsize__', '__bases__', '__flags__', '__doc__', '__delattr__', '__le__', '__repr__', '__hash__', '__ge__']
      
      >>> A.__bases__
      (<type 'object'>,)
      >>> type(A).__dict__['__bases__'].__get__(A, type)
      (<type 'object'>,)
      
      由于
      type
      object
      的子类,因此
      type
      上的
      dir()
      调用将包含
      object
      中的一些项:

      >>> set(dir(type)) - set(type.__dict__)
      set(['__reduce_ex__', '__str__', '__format__', '__reduce__', '__class__', '__subclasshook__', '__sizeof__'])
      

      可能是重复的你甚至没有读过我的问题,是吗?2.x的答案没有过时。你可以写
      \uuuuu getattr\uuuuu
      来做任何事情。我有几个类,其中
      \uuuu getattr\uuuuu
      说需要查询URL-没有办法提前知道该URL将返回什么,因此无法生成URL查看一个详尽的属性列表。
      \uuuuuu dir\uuuuu
      大多数时候都会返回大多数属性,但由于获取和设置属性的动态特性,确实无法始终获取完整的列表。至于为什么
      \uuuu base\uuuuu
      是隐藏的,而不是
      \uu name\uuuu
      ,我无法告诉您。这就是为什么问题被标记为
      Python3.x
      ,而不是
      Python2.x
      。另一个问题通常是关于Python的。它适用于2.x和3.x。这个问题是其中的一个子问题。答案已经在那里了。我明白了,所以我最初关于它们是隐藏的假设是非常错误的,像
      \uuu base\uuuuuuuu
      这样的属性只是不正确的从
      type
      派生,因此调用类似
      dir()的函数
      类型的子类上
      不会返回继承的属性。另外,关于存在一个获取所有内容的函数,我猜简单的答案是,如果我想要这样的函数,最好自己实现,因为它不存在,对吧?@DimitrisJim几乎正确,但是“
      dir()
      类型的子类上的
      应该是“
      dir()
      类型的实例上的
      ”,例如,如果您创建了一个具有某些属性的元类,那么它的实例(也称为类)我们看不到这些属性,但属性访问仍然有效。不,没有这样的函数可用,至少在标准库中没有。好的,我明白了。我唯一没有得到的东西(也许我应该问另一个问题)再次给出一个空的类定义,为什么像
      \uuuuuuuuuuuuuuuu
      这样的
      类型
      的某些继承属性在
      \uuuuuuuuuuuuuuuuu
      \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>中可见,或者
      \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu__
      不是:
      set(dir(A))==set(list(object.\uu dict\uu)+list(A.\uu dict\uu))
      。Python 2:;Python 3:谢谢,Ashwini。我想我明白了。如果我再次迷路,我会问一个相关的问题。再见!
      >> class A(object):
      ...     spam = 'eggs'
      ...
      >>> a = A()
      >>> a.foo = 100
      >>> a.bar = 200
      >>> a.__dict__
      {'foo': 100, 'bar': 200}
      >>> A.__dict__
      dict_proxy({'__dict__': <attribute '__dict__' of 'A' objects>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None, 'spam': 'eggs'})
      
      >>> set(dir(type)) - set(type.__dict__)
      set(['__reduce_ex__', '__str__', '__format__', '__reduce__', '__class__', '__subclasshook__', '__sizeof__'])