2013-07-29 95 views
7

Bộ tên được đặt tên thật dễ tạo, loại đối tượng nhẹ. namedtuple trường hợp có thể được tham chiếu bằng cách sử dụng biến thể đối tượng biến hoặc cú pháp tuple tiêu chuẩn. Nếu các cấu trúc dữ liệu này có thể được truy cập cả bởi các chỉ số đối tượng de232 &, chúng được triển khai thực hiện như thế nào? Có phải thông qua bảng băm không?Làm thế nào có tên tuples được thực hiện nội bộ trong python?

+0

kiểm tra liên kết này. điều này có thể giúp bạn. (http://stackoverflow.com/questions/9872255/when-and-why-should-i-use-a-namedtuple-instead-of-a-dictionary) –

Trả lời

13

Trên thực tế, nó rất dễ dàng để tìm hiểu làm thế nào một cho namedtuple được thực hiện: nếu bạn vượt qua đối số từ khóa verbose=True khi tạo nó, định nghĩa lớp của nó được in:

>>> Point = namedtuple('Point', "x y", verbose=True) 
from builtins import property as _property, tuple as _tuple 
from operator import itemgetter as _itemgetter 
from collections import OrderedDict 

class Point(tuple): 
    'Point(x, y)' 

    __slots__ =() 

    _fields = ('x', 'y') 

    def __new__(_cls, x, y): 
     'Create new instance of Point(x, y)' 
     return _tuple.__new__(_cls, (x, y)) 

    @classmethod 
    def _make(cls, iterable, new=tuple.__new__, len=len): 
     'Make a new Point object from a sequence or iterable' 
     result = new(cls, iterable) 
     if len(result) != 2: 
      raise TypeError('Expected 2 arguments, got %d' % len(result)) 
     return result 

    def _replace(_self, **kwds): 
     'Return a new Point object replacing specified fields with new values' 
     result = _self._make(map(kwds.pop, ('x', 'y'), _self)) 
     if kwds: 
      raise ValueError('Got unexpected field names: %r' % list(kwds)) 
     return result 

    def __repr__(self): 
     'Return a nicely formatted representation string' 
     return self.__class__.__name__ + '(x=%r, y=%r)' % self 

    @property 
    def __dict__(self): 
     'A new OrderedDict mapping field names to their values' 
     return OrderedDict(zip(self._fields, self)) 

    def _asdict(self): 
     '''Return a new OrderedDict which maps field names to their values. 
      This method is obsolete. Use vars(nt) or nt.__dict__ instead. 
     ''' 
     return self.__dict__ 

    def __getnewargs__(self): 
     'Return self as a plain tuple. Used by copy and pickle.' 
     return tuple(self) 

    def __getstate__(self): 
     'Exclude the OrderedDict from pickling' 
     return None 

    x = _property(_itemgetter(0), doc='Alias for field number 0') 

    y = _property(_itemgetter(1), doc='Alias for field number 1') 

Vì vậy, đó là một lớp con của tuple với một số phương thức bổ sung để cung cấp cho nó hành vi bắt buộc, hằng số cấp lớp _fields chứa các tên trường và các phương thức property để truy cập thuộc tính vào các thành viên của bộ dữ liệu.

Đối với mã thực sự xây dựng định nghĩa lớp này, đó là deep magic.