6

いくつかのフィールドを格納し、いくつかのプロパティを持つ Python クラスがあります。

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

  @property
  def z(self):
    return self.x+1

私ができるようにするには、クラスにどのような変更を加える必要がありますか

>>> a = A(1,5)
>>> dict(a)
{'y':5, 'z':2}

戻りたいことを指定する場所yz? a.__dict__を含むが含まないため、単に使用することはできませxz。でアクセスできるものは何でも指定できるようにしたいと思います__getattribute__

4

3 に答える 3

13

__iter__()オブジェクトのアイテムのイテレータをキーと値のペアとして返すメソッドをクラスに追加します。次に、オブジェクトインスタンスをコンストラクターに直接渡すことができます。dict()これは、一連のキーと値のペアを受け入れるためです。

def __iter__(self):
    for key in "y", "z":
        yield key, getattr(self, key)

これをもう少し柔軟にし、属性のリストをサブクラスで(またはプログラムで)簡単にオーバーライドできるようにする場合は、キーリストをクラスの属性として保存できます。

_dictkeys = "y", "z"

def __iter__(self):
    for key in self._dictkeys:
        yield key, getattr(self, key)

ディクショナリにすべての属性(親クラスから継承された属性を含む)を含める場合は、次を試してください。

def __iter__(self):
    for key in dir(self):
        if not key.startswith("_"):
            value = getattr(self, key)
            if not callable(value):
                yield key, value

これには、「_」で始まるメンバーと呼び出し可能なオブジェクト(クラスや関数など)は含まれません。

于 2012-06-06T13:57:32.823 に答える
5

この問題に対する合理的なアプローチは、メソッドを作成することだと思いますasdict。dict に含めるキーを指定したい場合、メソッドが呼び出されたときにその情報が渡されることに満足していると思います。そうでない場合は、お知らせください。(これにはkindallの優れた提案が組み込まれています。)

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

    @property
    def z(self):
        return self.x+1

    def asdict(self, *keys):
        if not keys:
            keys = ['y', 'z']
        return dict((key, getattr(self, key)) for key in keys)

テスト済み:

>>> A(1, 2).asdict('x', 'y')
{'y': 2, 'x': 1}
>>> A(1, 2).asdict()
{'y': 2, 'z': 2}
于 2012-06-06T13:54:11.603 に答える
0

これを解決する単純な方法は次のようになります。あなたのニーズには十分ではないかもしれませんが、見逃した場合に備えて指摘しているだけです.

>>> dict(y=a.y, z=a.z)
>>> {'y': 5, 'z': 2}
于 2012-06-06T13:56:26.530 に答える