2013-11-14 3 views
-3

с ++ тип структуры пример:Как реализовать структуры типа C++ в python?

Struct xyz { 
    uint64_t a; 
    uint32_t b; 
    uint16_t c; 
    bool  d; 
    char  e; 
} var; 

, где я могу получить к нему доступ с помощью var.a = 1; var.b = 2, и так далее ...

Здесь у меня есть массив, чтобы инициализировать эту структуру, как взять список питона:

values = [0x64, 0x32, 0x16, true, 'a']; 

Мне нужно отобразить это значение списка на структуру элементов, Так что можно получить с помощью var.a , если печать var.a он должен распечатать 0x64

Просьба указать, как весь сценарий может быть реализован в python наиболее эффективным способом. Что я реализовал как, как показано ниже:

Class xyz(Structure): 
    __field__ [ 
       (a, c_uint64, 64), 
       (b, c_uint32, 32), 
       (c, c_uint16, 16), 
       (d, c_bool), 
       (e, c_char) 
      ] 
    def __init__(self, p, q, r, s, t): 
     self.a = p 
     self.b = q 
     self.c = r 
     self.d = s 
     self.e = t 

obj = xyz(10, 11, 12, True, 'R') 

Он отлично работает, является ли это правильное использование или есть лучший вариант. Это также дает мне привилегию для двух полей, которые могут быть в том случае, когда мне нужен int из 14 бит.

+1

Использовать 'класс' вместо структуры ?! –

+0

Возможный дубликат [C-подобных структур в Python] (http://stackoverflow.com/questions/35988/c-like-structures-in-python) –

+0

Мне очень нравится смотреть, какие у вас проблемы? – cmd

ответ

3

В Python, мы, как правило, используют классы вместо структур (если вы хотите создать структур, так что вы можете связать вместе соответствующие данные в единой структуре данных)

class xyz(object): 
    def __init__(self, a, b, c, d, e): 
     self.a = a 
     self.b = b 
     self.c = c 
     self.d = d 
     self.e = e 

>>> my_var = xyz(0x64, 0x32, 0x16, True, 'a') 
>>> print my_var.a 
100 

Если это слишком многословным , вы можете попробовать использовать namedtuples, которые создают свой род коллажи между классом и кортежем в строке кода

>>> from collections import namedtuple 
>>> xyz = namedtuple('xyz', ['a', 'b', 'c', 'd', 'e']) # Creates an 'xyz' class 
>>> my_var = xyz(0x64, 0x32, 0x16, True, 'a') # Creates an instance of that class 
>>> print my_var.a 
100 

Если вы хотите, чтобы отобразить список элементов для вашего класса, вы можете сделать следующее (используя либо классы, либо именованные кортежи):

>>> vars = [0x64, 0x32, 0x16, True, 'a'] 
>>> my_var = xyz(*vars) 
>>> print my_var.a 
100 

В Python действительно нет проверки типов, что аналогично тому, как это делает C. Члены класса не имеют врожденного типа любого типа - они больше похожи на ящики, в которые можно помещать произвольные типы данных. (C статически, но слабо типизирован, тогда как Python динамически, но строго типизирован).

Я полагаю, вы могли бы использовать комбинацию свойств и, возможно, декораторов, чтобы создать свою собственную проверку типов, но в подавляющем большинстве случаев это перебор.


Если вы хотите создать на структуру, так что вы можете буквально конвертировать между значениями Python и структурами C манипулировать двоичные данные, рекомендуются использовать модуль struct, который позволяет создавать и манипулировать структуры с стилем специально для обеспечения совместимости.

Если вы просто ищете способы просто организовать и инкапсулировать свой код, структурный модуль не будет хорошим выбором.

+0

@ronex dicapriyo, пожалуйста, сделайте свой собственный ответ, если вы нашли что-то, что работает для вас, вместо того, чтобы пытаться [изменить чужой ответ] (http://stackoverflow.com/review/spected-edits/3366675) или пытаться [изменить его во второй раз] (http://stackoverflow.com/review/spected-edits/3366700). – gunr2171

+0

@ gunr2171 Этот вариант недоступен для меня. –

+0

@ronexdicapriyo, ваш вопрос приостановлен, пока вы не сможете изменить свой вопрос, чтобы его снова открыть. В этот момент вы можете добавить свой собственный ответ. – gunr2171

Смежные вопросы