2

誰でも例を挙げることができますか?

クラスと名前付きタプルでの変数の使用の違いは何ですか?

4

4 に答える 4

9

の戻り値namedtuple クラスです。闇魔法なし。名前付きタプルの戻り値をクラスに「変換」する必要はありません。それはまさにそれを返しました。

namedtupleから継承する新しいクラスを作成し__builtin__.tupleます。を呼び出すと、次のシンタックス シュガーを持つnamedtuple('Point', 'x y')(1, 0)タプル オブジェクトが得られます。(1, 0)

  • どこでの__dict__マッピング{'x': 1, 'y', 0}
  • それぞれandを呼び出す2 つのプロパティxand 。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})
于 2012-05-05T04:13:33.533 に答える
3

非常に漠然とした質問です。

次のような構造を意味していると思います

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は を表し、 はx1表しますy) によるアクセスの方が高速です。ただし、 attr によるアクセスは遅くなりますmy_point1.xmy_point1.yこれは、二重ルックアップと追加の関数の実行のためです (ソースを参照してください - の動作については十分に文書化されていますnamedtuple) 。

myPoint2attr my_point2.x、によってのみアクセス可能my_point2.yです。また、 attr によるアクセスは、 attrmyPoint2によるアクセスよりも高速ですmyPoint1

また、使用しない場合、すべてのインスタンスに対して属性/メソッドのdictが作成されるため (それらを動的に調整するため - 属性、フィールド、メソッドなどを追加または削除するため)、スロットがクラスに対して一度だけ作成されるかどうかにかかわらず__slots__、すべてのインスタンスはより多くのメモリを消費します。

簡単に言うと、通常は として機能するが、指定された属性によってもアクセスできるデータをnamedtuple返します。tuple subclasstuple

于 2012-05-05T06:40:11.847 に答える