誰でも例を挙げることができますか?
クラスと名前付きタプルでの変数の使用の違いは何ですか?
の戻り値namedtuple
はクラスです。闇魔法なし。名前付きタプルの戻り値をクラスに「変換」する必要はありません。それはまさにそれを返しました。
namedtuple
から継承する新しいクラスを作成し__builtin__.tuple
ます。を呼び出すと、次のシンタックス シュガーを持つnamedtuple('Point', 'x y')(1, 0)
タプル オブジェクトが得られます。(1, 0)
__dict__
マッピング{'x': 1, 'y', 0}
x
and 。y
__getitem__(0)
__getitem__(1)
__repr__
メソッド'Point(x=1, y=0)'
これ以外は単なるタプル オブジェクトです。その属性と属性の数は不変です。
nametuple('Point', 'x, y')
ただし、次のものを取得して代わりに取得したいという意味だと思います。
class Point:
def __init__(x, y):
self.x = x
self.y = y
この場合、 を誤用nametuple
しており、代わりに を使用する必要がありますtype
。
def init(self, x, y):
self.x, self.y = x, y
Point = type('Point', (object,), {'__init__': init})
非常に漠然とした質問です。
次のような構造を意味していると思います
myPoint1 = namedtuple('myPoint1','x y')
と
class myPoint2(object):
__slots__ = ['x','y']
def __init__(self, x, y)
self.x = x
self.y = y
myPoint1
インデックスmy_point1[0]
, my_point1[1]
(ここで0
は を表し、 はx
を1
表しますy
) によるアクセスの方が高速です。ただし、 attr によるアクセスは遅くなりますmy_point1.x
。my_point1.y
これは、二重ルックアップと追加の関数の実行のためです (ソースを参照してください - の動作については十分に文書化されていますnamedtuple
) 。
myPoint2
attr my_point2.x
、によってのみアクセス可能my_point2.y
です。また、 attr によるアクセスは、 attrmyPoint2
によるアクセスよりも高速ですmyPoint1
。
また、使用しない場合、すべてのインスタンスに対して属性/メソッドのdictが作成されるため (それらを動的に調整するため - 属性、フィールド、メソッドなどを追加または削除するため)、スロットがクラスに対して一度だけ作成されるかどうかにかかわらず__slots__
、すべてのインスタンスはより多くのメモリを消費します。
簡単に言うと、通常は として機能するが、指定された属性によってもアクセスできるデータをnamedtuple
返します。tuple subclass
tuple