1. ホーム
  2. パイソン

[解決済み】pythonでオブジェクトの属性を繰り返し処理する【重複あり

2022-04-11 14:24:43

質問

私はいくつかの属性とメソッドを持つPythonのオブジェクトを持っています。 私はオブジェクトの属性を繰り返し処理したいです。

class my_python_obj(object):
    attr1='a'
    attr2='b'
    attr3='c'

    def method1(self, etc, etc):
        #Statements

オブジェクトのすべての属性とその現在の値を含む辞書を生成したいのですが、それを動的な方法で行いたいと思います (後で別の属性を追加する場合、関数も忘れずに更新する必要がないように)。

phpでは変数をキーとして使うことができますが、pythonのオブジェクトは原稿を書くことができないので、このためにドット記法を使うと、私の意図しないvarの名前で新しい属性が作成されてしまうのです。

わかりやすくするために

def to_dict(self):
    '''this is what I already have'''
    d={}
    d["attr1"]= self.attr1
    d["attr2"]= self.attr2
    d["attr3"]= self.attr3
    return d

-

def to_dict(self):
    '''this is what I want to do'''
    d={}
    for v in my_python_obj.attributes:
        d[v] = self.v
    return d

更新しました。 属性とは、このオブジェクトの変数のみを意味し、メソッドではありません。

解決方法は?

のようなクラスがあると仮定します。

>>> class Cls(object):
...     foo = 1
...     bar = 'hello'
...     def func(self):
...         return 'call me'
...
>>> obj = Cls()

呼び出し dir は、python の特殊な属性を含む、そのオブジェクトのすべての属性を返します。ただし、オブジェクトの属性の中には、メソッドなど呼び出し可能なものもあります。

>>> dir(obj)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bar', 'foo', 'func']

リスト内包を使えば、いつでも特殊なメソッドをフィルタリングすることができます。

>>> [a for a in dir(obj) if not a.startswith('__')]
['bar', 'foo', 'func']

または、map/filters を好む場合。

>>> filter(lambda a: not a.startswith('__'), dir(obj))
['bar', 'foo', 'func']

メソッドをフィルタリングしたい場合は、組み込みの callable をチェックとして使用します。

>>> [a for a in dir(obj) if not a.startswith('__') and not callable(getattr(obj, a))]
['bar', 'foo']

を使って、クラスとそのインスタンス・オブジェクトの違いを検査することもできます。

>>> set(dir(Cls)) - set(dir(object))
set(['__module__', 'bar', 'func', '__dict__', 'foo', '__weakref__'])