web-dev-qa-db-ja.com

オブジェクトの属性を一覧表示する

クラスのインスタンスに存在する属性のリストを取得する方法はありますか?

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"が出力されることです。これに、スクリプトのさまざまな部分から現在の属性を見せてもらいたいのです。

214
MadSc13ntist
>>> 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 も役に立ちます。

217
Roger Pate
dir(instance)
# or (same value)
instance.__dir__()
# or
instance.__dict__

その後、type()を使ってどの型であるか、callable()を使ってメソッドであるかをテストできます。

130
mkotechno

vars(obj)はオブジェクトの属性を返します。

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

もちろん、これはクラス定義内のメソッドや属性を表示します。 i.startwith('__')i.startwith('_')に変更することで "private"メソッドを除外することができます

27
SilentGhost

inspect モジュールはオブジェクトを調べる簡単な方法を提供します。

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)

最初の文字列は単なる文字列(その名前)なので、ismethod()iの2番目の要素で使用されています。

オフトピック:クラス名には CamelCase を使用します。

21
Fermi paradox

これまでの答えはすべて正解です。あなたが尋ねていることには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'}
12
grepit

属性の完全なリストを一覧表示するにはdir()を使うべきだとよく言われます。ただし、一般的な考えに反して、dir()all属性を引き出すことはしません。たとえば、クラス自体からアクセスできるとしても、__name__がクラスのdir()リストにない可能性があります。 dir()Python 2Python 3 )のドキュメントから:

Dir()は主に対話型プロンプトでの使用の便宜のために提供されているので、厳密にまたは一貫して定義された名前のセットを提供することを試みるよりも面白い名前のセットを提供しようとします。たとえば、引数がクラスの場合、メタクラス属性は結果リストに含まれません。

dir()によって返されるリストは、__dir__()メソッドの実装、クラスまたはその親の1つでの__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)
10
Michael Ekoka

これは何のために欲しいですか?あなたの正確な意図を知らずにあなたに最良の答えを得ることは難しいかもしれません。

  • クラスのインスタンスを特定の方法で表示したい場合は、ほとんどの場合手動でこれを行うのが良いでしょう。これはあなたが望むものを正確に含み、あなたが望まないものを含まないであろう、そして順序は予測可能であろう。

    クラスの内容を表示する方法を探しているなら、手動であなたが気にする属性をフォーマットして、あなたのクラスのための__str__または__repr__メソッドとしてこれを提供してください。

  • オブジェクトがどのように機能するかを理解するためにオブジェクトにどのようなメソッドなどが存在するのかを知りたい場合は、helpを使用してください。 help(a)は、そのドキュメント文字列に基づいて、オブジェクトのクラスに関するフォーマットされた出力を表示します。

  • dirは、プログラム的にオブジェクトのすべての属性を取得するために存在します。 (__dict__にアクセスしても、私は同じようにグループ化しますが、私は自分では使いません)。ただし、これには必要なものが含まれていない可能性があります。それは信頼できず、人々は彼らがそれを望むよりもずっと頻繁にそれを望むと思う。

  • 多少直交しているが、現時点ではPython 3はほとんどサポートされていない。本物のソフトウェアを書くことに興味があるなら、あなたはnumpy、lxml、Twisted、PIL、あるいはまだPython 3をサポートしておらず、間もなく計画を立てていないいくつかのWebフレームワークのようなサードパーティーのものが欲しいでしょう。 2.6と3.xのブランチの違いはわずかですが、ライブラリサポートの違いは非常に大きいです。

9
Mike Graham

順番に実行されているPythonシェルスクリプトを見てください。ここではクラスの属性を文字列フォーマットでカンマで区切って取得します。

>>> 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を使っています

8
Lokesh kumar

それには複数の方法があります。

#! /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$
7
user1928764

属性を取得するには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)も試してください。

6
Jason Angel

オブジェクトの属性を取得する

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
0
Blessed
attributes_list = [attribute for attribute in dir(obj) if attribute[0].islower()]
0
shammerw0w

前に書いたように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クラス属性を出力しないため、必要なクラス属性を省略することがあります。
時には、属性はインスタンスメンバーだと思うかもしれませんが、そうではないのでこの例では表示されません。

0
ShmulikA

次のPythonシェルスクリプティングの実行を順番に見てください。クラスの作成からインスタンスのフィールド名の抽出までの解決策になります。

>>> 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']
>>>
0
hygull