列出对象的属性

Mad*_*ist 256 python class python-3.x

有没有办法获取类实例上存在的属性列表?

class new_class():
    def __init__(self, number):
        self.multi = int(number) * 2
        self.str = str(number)

a = new_class(2)
print(', '.join(a.SOMETHING))
Run Code Online (Sandbox Code Playgroud)

期望的结果是将输出"multi,str".我希望这能看到脚本各个部分的当前属性.

小智 248

>>> class new_class():
...   def __init__(self, number):
...     self.multi = int(number) * 2
...     self.str = str(number)
... 
>>> a = new_class(2)
>>> a.__dict__
{'multi': 4, 'str': '2'}
>>> a.__dict__.keys()
dict_keys(['multi', 'str'])
Run Code Online (Sandbox Code Playgroud)

您也可以找到有用的pprint.

  • __dict__用法的问题刚好出现在r/python上.有人指出vars(a)等同于.__ dict__ (27认同)
  • 具体来说,`pprint.pprint(a .__ dict __)`对属性做了很好的印刷. (8认同)
  • 请注意,这仅适用于用户定义的类,不适用于内置或扩展类型。 (7认同)
  • 如果有人想知道,这也适用于Python 2.7 (5认同)
  • 如果该类有一个 `__slots__` 而不是 `__dict__`,这将不起作用,并且如果它同时具有这两种情况,它将部分工作。 (3认同)

Hte*_*hno 153

dir(instance)
# or (same value)
instance.__dir__()
# or
instance.__dict__
Run Code Online (Sandbox Code Playgroud)

然后你可以测试使用什么类型type()或者是否是一个方法callable().

  • py3k中不存在`callable` (3认同)
  • (也许不应该在Python 2中使用.) (3认同)

roh*_*hpr 60

vars(obj) 返回对象的属性.

  • 仅适用于__dict__属性. (12认同)

Sil*_*ost 31

>>> ', '.join(i for i in dir(a) if not i.startswith('__'))
'multi, str'
Run Code Online (Sandbox Code Playgroud)

这当然会打印类定义中的任何方法或属性.您可以通过更改i.startwith('__')为"排除""私有"方法i.startwith('_')


Fer*_*dox 23

检查模块提供了简便的方法来检查的对象:

inspect模块提供了几个有用的函数来帮助获取有关活动对象的信息,例如模块,类,方法,函数,回溯,框架对象和代码对象.


使用getmembers()您可以查看班级的所有属性及其值.要排除私有或受保护的属性使用.startswith('_').要排除方法或功能,请使用inspect.ismethod()inspect.isfunction().

import inspect


class NewClass(object):
    def __init__(self, number):
        self.multi = int(number) * 2
        self.str = str(number)

    def func_1(self):
        pass


a = NewClass(2)

for i in inspect.getmembers(a):
    # Ignores anything starting with underscore 
    # (that is, private and protected attributes)
    if not i[0].startswith('_'):
        # Ignores methods
        if not inspect.ismethod(i[1]):
            print(i)
Run Code Online (Sandbox Code Playgroud)

注意,ismethod()在第二个元素上使用,i因为第一个元素只是一个字符串(它的名字).

Offtopic:使用CamelCase作为类名.


gre*_*pit 22

之前的所有答案都是正确的,您可以根据自己的要求选择三个选项

1. DIR()

2. VARS()

3. __dict__

>>> dir(a)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'multi', 'str']
>>> vars(a)
{'multi': 4, 'str': '2'}
>>> a.__dict__
{'multi': 4, 'str': '2'}
Run Code Online (Sandbox Code Playgroud)

  • `vars(foo)` 返回 `foo.__dict__` (8认同)

Mic*_*oka 11

通常会提到要列出您应该使用的完整属性列表dir().但请注意,与普遍看法相反,dir()并没有带出所有属性.例如,您可能会注意到__name__类的dir()列表中可能会丢失,即使您可以从类本身访问它.来自doc on dir()(Python 2,Python 3):

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

像下面这样的函数往往更加完整,尽管不能保证完整性,因为返回的列表dir()可能会受到许多因素的影响,包括实现__dir__()方法,或自定义__getattr__()__getattribute__()在类或其父类之一上.请参阅提供的链接以获取更多详

def dirmore(instance):
    visible = dir(instance)
    visible += [a for a in set(dir(type)).difference(visible)
                if hasattr(instance, a)]
    return sorted(visible)
Run Code Online (Sandbox Code Playgroud)


Jas*_*gel 10

您可以dir(your_object)用来获取属性和getattr(your_object, your_object_attr)获取值

用法:

for att in dir(your_object):
    print (att, getattr(your_object,att))
Run Code Online (Sandbox Code Playgroud)

如果您的对象没有__dict__,这将特别有用。如果不是这种情况,您也可以尝试var(your_object)


Mik*_*ham 9

你想要什么?在不知道您的确切意图的情况下,可能很难为您提供最佳答案.

  • 如果要以特定方式显示类的实例,则手动执行此操作几乎总是更好.这将包括您想要的内容,而不包括您不想要的内容,订单将是可预测的.

    如果您正在寻找显示类内容的方法,请手动设置您关注的属性的格式,并将其作为类的方法__str____repr__方法提供.

  • 如果您想了解对象有哪些方法可以理解它是如何工作的,请使用help.help(a)将根据其文档字符串向您显示有关对象类的格式化输出.

  • dir存在以编程方式获取对象的所有属性.(访问会__dict__做一些我会分组但我不会自己使用的东西.)但是,这可能不包括你想要的东西,它可能包括你不想要的东西.这是不可靠的,人们认为他们比他们更经常地想要它.

  • 在某种程度上正交的说明中,目前对Python 3的支持很少.如果您有兴趣编写真正的软件,那么您将需要第三方的东西,如numpy,lxml,Twisted,PIL或任何数量的Web框架,这些框架还不支持Python 3,并且没有任何时间计划.2.6和3.x分支之间的差异很小,但库支持的差异很大.

  • 我只想指出五年后(现在),我相信你提到的所有第三方模块都支持python3.资料来源:https://python3wos.appspot.com/ (4认同)

Jef*_*man 7

有多种方法可以做到:

#! /usr/bin/env python3
#
# This demonstrates how to pick the attiributes of an object

class C(object) :

  def __init__ (self, name="q" ):
    self.q = name
    self.m = "y?"

c = C()

print ( dir(c) )
Run Code Online (Sandbox Code Playgroud)

运行时,此代码生成:

jeffs@jeff-desktop:~/skyset$ python3 attributes.py 
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__',      '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm', 'q']

jeffs@jeff-desktop:~/skyset$
Run Code Online (Sandbox Code Playgroud)

  • 为什么这个答案被低估?出于调试目的,dir工作得很好! (2认同)

小智 7

请参阅已按顺序执行的python shell脚本,在这里您将获得以逗号分隔的字符串格式的类的属性.

>>> class new_class():
...     def __init__(self, number):
...         self.multi = int(number)*2
...         self.str = str(number)
... 
>>> a = new_class(4)
>>> ",".join(a.__dict__.keys())
'str,multi'<br/>
Run Code Online (Sandbox Code Playgroud)

我正在使用python 3.4


Ger*_*ica 6

除了这些答案之外,我还将包含一个函数 (python 3),用于喷出几乎任何值的整个结构。它用于dir建立属性名称的完整列表,然后getattr与每个名称一起使用。它显示值的每个成员的类型,并在可能的情况下显示整个成员:

import json

def get_info(obj):

  type_name = type(obj).__name__
  print('Value is of type {}!'.format(type_name))
  prop_names = dir(obj)

  for prop_name in prop_names:
    prop_val = getattr(obj, prop_name)
    prop_val_type_name = type(prop_val).__name__
    print('{} has property "{}" of type "{}"'.format(type_name, prop_name, prop_val_type_name))

    try:
      val_as_str = json.dumps([ prop_val ], indent=2)[1:-1]
      print('  Here\'s the {} value: {}'.format(prop_name, val_as_str))
    except:
      pass
Run Code Online (Sandbox Code Playgroud)

现在,以下任何一项都应该提供洞察力:

get_info(None)
get_info('hello')

import numpy
get_info(numpy)
# ... etc.
Run Code Online (Sandbox Code Playgroud)