0

ここで本当に簡単な質問です。ベンが作成された後、名前を呼び出すためにベン[0]を呼び出し、年齢を呼び出すためにベン[1]を呼び出すことができますか?

これらの属性にリストとしてアクセスする方法があるかどうか疑問に思っています。

class People():
    def __init__(self, name, age):

ben=People("ben", "10")
4

3 に答える 3

1

クラスの属性には固有の順序がないため、クラスでやりたいことは不可能です。それらは dict に格納されているため、 to の代わりににマップben[0]するben.name合理的な方法はありませんben.age

ただし、いくつかの異なる方法でクラスを変更して、妥当なものにすることができます。

  • 注文を選択し、リストに保存します (例: クラス属性)。次に、あなた__getitem__だけの呼び出しgetattr(self, self._fields[index])
  • プログラムで定義できる順序 (並べ替え順序など) を選択します。
  • メタクラスを使用して、クラスにその属性を に格納させます。OrderedDictこの場合、それらを割り当てる__init__順序がそれらの順序になります。だからそれはただself.__dict__.values()[index]です。
  • __slots__属性の辞書の代わりに使用します。

のソースをcollections.namedtuple見ると、これらの組み合わせを使用していることがわかります。_fieldsフィールド名を格納するという名前のクラス属性があり、フィールド値は継承元のタプルに格納され、次に として定義__dict__されます。@propertyそれはそれらをその場でまとめOrderedDictます。これはおそらく、必要以上に巧妙です。そして、これほど賢くする必要がある場合は、最初から a を使用するか、a から継承してくださいnamedtuple

于 2013-10-25T22:16:52.153 に答える