Pythonはこのように「クラス」を作成することもできますか?

4457 ワード

標準のタプルtupleは、数値インデックスを使用してメンバーにアクセスしていることはよく知られていますが、どの数値インデックスがどのメンバー値に対応するかを覚えておくのは難しいです.特に、タプルに多くのメンバーが含まれている場合、エラーが発生することがあります.
この时、私达の主役は登场します:namedtuple、それはすべてのメンバーのために1つのインデックスを割り当てると同时に、もう1つの名前を割り当てて、1つの「クラス」のように使います.
namedtupleは主に、名前を使用して要素にアクセスできるデータオブジェクトを生成するために使用され、通常、コードの可読性を向上させるために使用されます.
namedtupleはtupleから受け継がれていますが、よりクールな特性を持っています.いわゆる「青は青より出ています」です.namedtupleはtupleに似たオブジェクトを作成し、オブジェクトにはアクセス可能なプロパティがあります.このオブジェクトはデータ属性を持つクラスに似ていますが、データ属性は読み取り専用です.
定義と使用
namedtupleの作成には、コンストラクション関数namedtuple()、パラメータはクラスの作成名、および要素名を含む文字列を使用する必要があります.
>>> from collections import namedtuple
>>> Person = namedtuple('Person','name age gender')
>>> type(Person)

>>> hoxis = Person('hoxis',18,'male')
>>> print(hoxis)
Person(name='hoxis', age=18, gender='male')
>>> hoxis.name
'hoxis'
>>> hoxis[0]
'hoxis'

上記の例から、.を使用してメンバー(obj.attr)にアクセスでき、デジタルインデックスを使用してアクセスできます.また、repr()関数も内蔵されています.
注意事項
メタグループと同様にnamedtupleも可変であり、メンバーを直接変更することはできません.
# hoxis     18  ,   
>>> hoxis.age
18
>>> hoxis.age = 28
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: can't set attribute

もし変えなければならないならば、_replace()の方法を使うことができて、しかしこの时実は1つの新しいnamedtupleを生成して、もとのはやはり変わっていないで、信じません:
# hoxis    18  
>>> hoxis_2 = hoxis._replace(age=28)
>>> hoxis
Person(name='hoxis', age=18, gender='male')
>>> hoxis_2
Person(name='hoxis', age=28, gender='male')

実はここは他の可変オブジェクトと似ていて、変えるには新しいデータを返すだけで、元のものは元のものです.your daye still your daye.
もう1つは、Pythonのキーワードをメンバー名として使用することはできません.例えば、classでは、ValueErrorの異常が放出されます.
>>> Person = namedtuple('Person','name age gender class')
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/lib/python3.5/collections/__init__.py", line 403, in namedtuple
    'keyword: %r' % name)
ValueError: Type names and field names cannot be a keyword: 'class'

メンバー名も重複できません:
>>> Person = namedtuple('Person','name age gender age')
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/lib/python3.5/collections/__init__.py", line 410, in namedtuple
    raise ValueError('Encountered duplicate field name: %r' % name)
ValueError: Encountered duplicate field name: 'age'

どうしても顔を頼りにしなければならないなら、私はclassを使います.では、rename=Trueの属性を設定する必要があります.
>>> Person = namedtuple('Person','name age gender class', rename=True)
>>> hoxis = Person('hoxis',18,'male','    ')
>>> hoxis
Person(name='hoxis', age=18, gender='male', _3='    ')

実はメンバー名が変更されて、classはまだ使っていないで、死んでも顔を頼りにしても役に立たない.の
拡張
namedtupleとdictが少し似ていることに気づきましたか?
実はnamedtupleには._asdict()という内蔵方法があり、dictを生成することができます.
>>> hoxis = Person('hoxis',18,'male')
>>> hoxis_dict = hoxis._asdict()
>>> hoxis_dict
OrderedDict([('name', 'hoxis'), ('age', 18), ('gender', 'male')])
>>> hoxis_dict['age']
18
>>> hoxis_dict['age'] = 28
>>> hoxis_dict
OrderedDict([('name', 'hoxis'), ('age', 28), ('gender', 'male')])

dictに変換すると、属性が変更されます.
もちろん、dictはnamedtupleに変換することもできますが、実際にはdictでnamedtupleを生成します.
>>> hoxis = Person(**hoxis_dict)
>>> hoxis
Person(name='hoxis', age=28, gender='male')

まとめ
tupleとdictionaryに比べて、namedtupleは少し総合的な意味を持っています.直感的で使いやすく、整数インデックスを使用して名前付きメタグループにアクセスする必要はありません.これにより、コードのメンテナンスが容易になります.さらに、namedtupleの各インスタンスにはオブジェクト辞書がないため、それらは軽量で、より多くのメモリを必要とせず、辞書よりも高速になります.
適当な時にnamedtupleを使ってみることをお勧めします.あなたは帰ってきていいですね.
役に立つと思ったら、私の微信に注目して、一緒に勉強して、一緒に進歩して、不定期に本を贈る活動を出してください.
あなたの関心は私に最大の励ましです!