Adlandırılmış düğümlerin oluşturulması kolay, hafif nesne türleridir. namedtuple
örnekleri nesne benzeri değişken erteleme veya standart tuple sözdizimi kullanılarak referans alınabilir. Bu veri yapılarına hem nesne erteleme & dizinleriyle erişilebiliyorsa, bunlar dahili olarak nasıl uygulanır? Karma tablolar mı?Python'da dahili isimler nasıl adlandırılır?
7
A
cevap
13
Aslında, belirli bir namedtuple
nasıl uygulandığını öğrenmek çok kolaydır: o oluştururken anahtar kelime argüman verbose=True
geçmesi halinde, bunun sınıf tanımı yazdırılır: Yani
>>> 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')
, bu tuple
bir alt sınıfı var gereken davranışı vermek için bazı ekstra yöntemlerle, alan adlarını içeren _fields
sınıf düzeyi sabiti ve tuple üyelerine öznitelik erişimi için property
yöntemleri.
Bu sınıf tanımının arkasında yatan kod gelince, bu deep magic.
bu bağlantıyı kontrol edin. Bu size yardımcı olabilir. (Http://stackoverflow.com/questions/9872255/when-and-why-should-i-use-a-namedtuple-instead-of-a-dictionary) –