Я недавно прочитал несколько SO-вопросов о метаклассах, и, хотя кажется, что это не нужно использовать большую часть времени (включая мой вопрос), я подумал, d быть интересным для этого случая.Создание метакласса для распаковки структуры в namedtuple
В питона Документами struct, есть пример с namedtuple здесь:
from collections import namedtuple
Student = namedtuple('Student', 'name serialnum school gradelevel')
Student._make(unpack('<10sHHb', record))
Мой вопрос: можно ли создать метакласса, что я мог бы использовать, чтобы сделать часть этого для меня? Как и мое предполагаемое решение:
class Student(object):
__metaclass__ = ???
fields = 'name serialnum school gradelevel'
struct = '<10sHHb'
s = Student(record) # and give same output as the _make() call above
Как это сделать?
Я не уверен, что вы здесь просите, но если хотите, вы можете использовать 'self .__ name__', чтобы получить имя класса, с которым работаете, поэтому вы можете построить' namedtuple' в ваш конструктор, агностик фактического имени, которое вы дали классу. – 2rs2ts
@ 2rs2ts Я хочу определить класс, просто указав его поля и структуру структуры, чтобы он мог быть построен из его данных напрямую. Так что результат 2-го блока совпадает с результатом 1-го блока. – Barry
Ох. Для этого я бы использовал 'setattr'. Я не знаком с модулем 'struct', но я бы сказал, передайте строку структуры и распакуйте его, а затем используйте' setattr' на основе результатов распаковки. – 2rs2ts