В питоне есть namedtuple, тупл к полям которого можно обращаться привычным синтаксисом object.field
namedtuple лучше обычных туплов тем, что к полям тупла можно обращаться по имени, легко добавлять к типу новые поля и удалять.
namedtuple лучше словарей/объектов тем, что не расходуют память на имена полей в каждом объекте.
Использование такое:
(
Read more... )
Comments 3
Самый же экономный способ - запаковать поля в целое.
class Point(int): # long в Python 2
def __new__(cls, x, y):
assert 0 <= x < 2**32
assert 0 <= y < 2**32
return int.__new__(cls, (x << 32) + y)
@property
def x(self):
return self >> 32
@property
def y(self):
return self & (2**32 - 1)
def __repr__(self):
return '%s(%r, %r)' % (self.__class__.__name__, self.x, self.y)
__str__ = __repr__
Reply
Reply
А я раньше велосипедил примерно так
class AdHoc:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def __str__(self):
return repr(self)
def __repr__(self):
return 'AdHoc(%s)' % (
', '.join(
'%s=%r' % kv for kv in self.__dict__.items()
)
)
p = AdHoc(x=1, y=2, z='hello')
print(p.x, p.y, p.z) # 1 2 hello
print(p) # AdHoc(x=1, y=2, z='hello') -- порядок может не сохраниться, кстати
p.t = None # атрибуты можно добавлять по ходу пьесы
print(p) # AdHoc(x=1, y=2, z='hello', t=None)
p.t = p
print(p) # исчерпание стека :)))
del p.t # удалять атрибуты тоже можно
print(p) # AdHoc(x=1, y=2, z='hello')
Но вот идея генерировать класс с заданными полями - это симпатично.
Reply
Leave a comment