列出对象的属性[重复]

2025-03-06 08:52:00
admin
原创
80
摘要:问题描述:有没有办法获取某个类的实例上存在的属性列表?class new_class(): def __init__(self, number): self.multi = int(number) * 2 self.str = str(number) a = new_...

问题描述:

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

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

a = new_class(2)
print(', '.join(a.SOMETHING))

期望的结果是输出“multi, str”。我希望它能够查看脚本各个部分的当前属性。


解决方案 1:

>>> 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'])

您可能还会发现pprint很有帮助。

解决方案 2:

dir(instance)
# or (same value)
instance.__dir__()
# or
instance.__dict__

然后,您可以测试 是什么类型type()或 是否 是一种方法callable()

解决方案 3:

所有前面的答案都是正确的,对于你要问的问题,你有三个选项

  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'}

解决方案 4:

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

解决方案 5:

检查模块:

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


使用 ,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


inst = NewClass(2)

for i in inspect.getmembers(inst):
    # 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)

请注意,由于的第二个元素只是一个字符串(它的名称),所以ismethod()使用它。i

题外话:使用CamelCase作为类名。

解决方案 6:

>>> ', '.join(i for i in dir(a) if not i.startswith('__'))
'multi, str'

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

解决方案 7:

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

用法 :

for att in dir(your_object):
    print (att, getattr(your_object,att))

如果你的对象没有 __dict__,这尤其有用。如果不是这种情况,你也可以尝试 var(your_object)

解决方案 8:

人们经常提到,要列出完整的属性列表,您应该使用dir()。但请注意,与普遍看法相反dir(),它不会列出所有属性。例如,您可能会注意到,即使您可以从类本身访问它__name__,类的列表中也可能缺少dir()。从文档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)

解决方案 9:

有多种方法可以做到这一点:

#! /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) )

运行时,此代码会产生:

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$

解决方案 10:

请查看按顺序执行的 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/>

我正在使用 Python 3.4

解决方案 11:

你要这个做什么?如果不知道你的确切意图,可能很难得到最佳答案。

  • 如果您想以特定方式显示类的实例,手动执行此操作几乎总是更好的选择。这将准确包含您想要的内容,而不包含您不想要的内容,并且顺序将是可预测的。

如果您正在寻找一种方法来显示类的内容,请手动格式化您关心的属性并将其作为类的__str____repr__方法提供。

  • 如果您想了解对象存在哪些方法等以了解其工作原理,请使用helphelp(a)将根据对象的文档字符串向您显示有关该对象类的格式化输出。

  • dir存在用于以编程方式获取对象的所有属性。(访问__dict__会做一些我认为相同的事情,但我自己不会使用。)但是,这可能不包括您想要的东西,也可能包括您不想要的东西。它是不可靠的,人们认为他们想要它的频率比他们实际想要的要高得多。

  • 从某种程度上说,目前对 Python 3 的支持非常少。如果您有兴趣编写真正的软件,那么您将需要第三方软件,例如 numpy、lxml、Twisted、PIL 或任何数量的 Web 框架,这些框架尚不支持 Python 3,并且近期也没有计划支持。2.6 和 3.x 分支之间的差异很小,但库支持方面的差异很大。

解决方案 12:

除了这些答案之外,我还将包括一个函数(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

现在,以下任何一项都应该能给你提供见解:

get_info(None)
get_info('hello')

import numpy
get_info(numpy)
# ... etc.

解决方案 13:

  • 使用__dict__vars 不起作用,因为它遗漏了__slots__

  • 使用__dict____slots__ 不起作用,因为它错过了__slots__基类。

  • 使用dir 不起作用,因为它包括类属性,例如方法或属性,以及对象属性。

  • 使用vars相当于使用__dict__

这是我所拥有的最好的:

from typing import Dict

def get_attrs( x : object ) -> Dict[str, object]:
    mro      = type( x ).mro()
    attrs    = { }
    has_dict = False
    sentinel = object()

    for klass in mro:
        for slot in getattr( klass, "__slots__", () ):
            v = getattr( x, slot, sentinel )

            if v is sentinel:
                continue

            if slot == "__dict__":
                assert not has_dict, "Multiple __dicts__?"
                attrs.update( v )
                has_dict = True
            else:
                attrs[slot] = v

    if not has_dict:
        attrs.update( getattr( x, "__dict__", { } ) )

    return attrs

解决方案 14:

获取对象的属性

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

new_object = new_class(2)                
print(dir(new_object))                   #total list attributes of new_object
attr_value = new_object.__dict__         
print(attr_value)                        #Dictionary of attribute and value for new_class                   

for attr in attr_value:                  #attributes on  new_class
    print(attr)

输出

['__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']

{'multi': 4, 'str': '2'}

multi
str

解决方案 15:

正如之前所写,使用obj.__dict__可以处理常见情况,但有些类没有__dict__属性和使用__slots__(主要是为了提高内存效率)。

更具弹性的方法示例:

class A(object):
    __slots__ = ('x', 'y', )
    def __init__(self, x, y):
        self.x = x
        self.y = y


class B(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y


def get_object_attrs(obj):
    try:
        return obj.__dict__
    except AttributeError:
        return {attr: getattr(obj, attr) for attr in obj.__slots__}


a = A(1,2)
b = B(1,2)
assert not hasattr(a, '__dict__')

print(get_object_attrs(a))
print(get_object_attrs(b))

此代码的输出:

{'x': 1, 'y': 2}
{'x': 1, 'y': 2}

注1:

Python 是一种动态语言,最好了解要从中获取属性的类,因为即使是这样的代码也可能会遗漏某些情况。

注意2:

此代码仅输出实例变量,意味着不提供类变量。例如:

class A(object):
    url = 'http://stackoverflow.com'
    def __init__(self, path):
        self.path = path

print(A('/questions').__dict__)

代码输出:

{'path': '/questions'}

此代码不会打印url类属性,可能会忽略所需的类属性。

有时我们可能认为属性是实例成员,但事实并非如此,因此不会使用此示例进行展示。

解决方案 16:

请按顺序查看以下 Python shell 脚本的执行,它将给出从创建类到提取实例的字段名称的解决方案。

>>> class Details:
...       def __init__(self,name,age):
...           self.name=name
...           self.age =age
...       def show_details(self):
...           if self.name:
...              print "Name : ",self.name
...           else:
...              print "Name : ","_"
...           if self.age:
...              if self.age>0:
...                 print "Age  : ",self.age
...              else:
...                 print "Age can't be -ve"
...           else:
...              print "Age  : ","_"
... 
>>> my_details = Details("Rishikesh",24)
>>> 
>>> print my_details
<__main__.Details instance at 0x10e2e77e8>
>>> 
>>> print my_details.name
Rishikesh
>>> print my_details.age
24
>>> 
>>> my_details.show_details()
Name :  Rishikesh
Age  :  24
>>> 
>>> person1 = Details("",34)
>>> person1.name
''
>>> person1.age
34
>>> person1.show_details
<bound method Details.show_details of <__main__.Details instance at 0x10e2e7758>>
>>> 
>>> person1.show_details()
Name :  _
Age  :  34
>>>
>>> person2 = Details("Rob Pike",0)
>>> person2.name
'Rob Pike'
>>> 
>>> person2.age
0
>>> 
>>> person2.show_details()
Name :  Rob Pike
Age  :  _
>>> 
>>> person3 = Details("Rob Pike",-45)
>>> 
>>> person3.name
'Rob Pike'
>>> 
>>> person3.age
-45
>>> 
>>> person3.show_details()
Name :  Rob Pike
Age can't be -ve
>>>
>>> person3.__dict__
{'age': -45, 'name': 'Rob Pike'}
>>>
>>> person3.__dict__.keys()
['age', 'name']
>>>
>>> person3.__dict__.values()
[-45, 'Rob Pike']
>>>

解决方案 17:

attributes_list = [attribute for attribute in dir(obj) if attribute[0].islower()]

解决方案 18:

__attrs__给出实例的属性列表。

>>> import requests
>>> r=requests.get('http://www.google.com')
>>> r.__attrs__
['_content', 'status_code', 'headers', 'url', 'history', 'encoding', 'reason', 'cookies', 'elapsed', 'request']
>>> r.url
'http://www.google.com/'
>>>
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3878  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2714  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   49  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   49  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   49  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用