Pythonはこのように「クラス」を作成することもできますか?
4457 ワード
標準のタプル
この时、私达の主役は登场します:
namedtupleは主に、名前を使用して要素にアクセスできるデータオブジェクトを生成するために使用され、通常、コードの可読性を向上させるために使用されます.
namedtupleはtupleから受け継がれていますが、よりクールな特性を持っています.いわゆる「青は青より出ています」です.namedtupleはtupleに似たオブジェクトを作成し、オブジェクトにはアクセス可能なプロパティがあります.このオブジェクトはデータ属性を持つクラスに似ていますが、データ属性は読み取り専用です.
定義と使用
namedtupleの作成には、コンストラクション関数namedtuple()、パラメータはクラスの作成名、および要素名を含む文字列を使用する必要があります.
上記の例から、
注意事項
メタグループと同様にnamedtupleも可変であり、メンバーを直接変更することはできません.
もし変えなければならないならば、
実はここは他の可変オブジェクトと似ていて、変えるには新しいデータを返すだけで、元のものは元のものです.your daye still your daye.
もう1つは、Pythonのキーワードをメンバー名として使用することはできません.例えば、
メンバー名も重複できません:
どうしても顔を頼りにしなければならないなら、私は
実はメンバー名が変更されて、classはまだ使っていないで、死んでも顔を頼りにしても役に立たない.の
拡張
namedtupleとdictが少し似ていることに気づきましたか?
実はnamedtupleには
dictに変換すると、属性が変更されます.
もちろん、dictはnamedtupleに変換することもできますが、実際にはdictでnamedtupleを生成します.
まとめ
tupleとdictionaryに比べて、namedtupleは少し総合的な意味を持っています.直感的で使いやすく、整数インデックスを使用して名前付きメタグループにアクセスする必要はありません.これにより、コードのメンテナンスが容易になります.さらに、namedtupleの各インスタンスにはオブジェクト辞書がないため、それらは軽量で、より多くのメモリを必要とせず、辞書よりも高速になります.
適当な時にnamedtupleを使ってみることをお勧めします.あなたは帰ってきていいですね.
役に立つと思ったら、私の微信に注目して、一緒に勉強して、一緒に進歩して、不定期に本を贈る活動を出してください.
あなたの関心は私に最大の励ましです!
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を使ってみることをお勧めします.あなたは帰ってきていいですね.
役に立つと思ったら、私の微信に注目して、一緒に勉強して、一緒に進歩して、不定期に本を贈る活動を出してください.
あなたの関心は私に最大の励ましです!