2015-11-11 3 views
2

Я использую библиотеку для обмена данными между C++, VHDL и SystemVerilog. Он использует кодегенераторы для создания структур данных, содержащих соответствующее поле. Подумайте о структуре данных типа c. Я хочу создать код python, который содержит функции datastructure и чтения/записи, чтобы установить и записать содержимое структуры данных из файла/в файл.Python: переменные базового класса печати

Для этого я пытаюсь написать программу, которая печатает все переменные в базовом классе с обновлениями из подкласса, но без переменных подкласса.

Идея заключается в том, что класс А является фактическим VHDL/SystemVerilog/C++, запись/структура и класс В содержит логику, чтобы сделать обработку и генерировать значения в классе А.

Например:

class A(object): 
    def __init__(self): 
     self.asd = "Test string" 
     self.foo = 123 

    def write(self): 
     print self.__dict__ 

class B(A): 
    def __init__(self): 
     A.__init__(self) 
     self.bar = 456 
     self.foo += 1 

    def write(self): 
     super(B, self).write() 

Вызов B.write() должно привести следующее: (Примечание увеличенное значение Foo)

"ASD: Тест String, Foo: 124"

, но вместо этого он дает

"ASD: Test String, бар: 456, Foo: 124".

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

+1

Как 'B.write()' будет работать, так как 'write' не является методом класса? –

+0

FWIW, вместо того, чтобы выводить класс B из класса A, он может быть более простым и простым, чтобы дать B-объектам объект A в качестве атрибута. –

ответ

3

Не существует различия между базовыми и подклассовыми переменными. По определению наследование является отношением is-a; все, что определено в базовом классе, как будто оно определено в подклассе.

Аналогично, все, что вы определяете на экземпляре в любой другой точке вашего кода, также появится в dict; Python не ограничивает вас добавлением новых переменных экземпляра в другом месте класса или даже извне.

Единственный способ сделать то, что вы хотите, это записать ключи при вводе A.__init__.

1

Вы сказали: «Я мог бы сравнить базовый словарь с подклассовым словарем и печатать только значения, которые появляются в обоих, но это не похоже на чистый путь». То, что вы пытаетесь сделать, не является естественным делом в Python, поэтому независимо от того, что вы делаете, это не будет чистым. Но на самом деле то, что вы предлагаете, невозможно, так как вы не можете получить базовый словарь, когда вы делаете вызов .write в экземпляре B. Самое близкое, что вы можете сделать, это взять его копию (или, как предлагает Даниэль Роземан, его ключи) сразу же после вызова __init__ в B, чтобы вы могли сослаться на эту копию позже, когда вам это нужно.

Вот код, который делает это:

class A(object): 
    def __init__(self): 
     self.asd = "Test string" 
     self.foo = 123 

    def write(self, d=None): 
     print self.__dict__ 

class B(A): 
    def __init__(self): 
     A.__init__(self) 
     self.parentkeys = self.__dict__.keys() 
     self.bar = 456 
     self.foo += 1 

    def write(self): 
     bdict = self.__dict__ 
     print dict((k, bdict[k]) for k in self.parentkeys) 


a = A() 
b = B() 
a.write() 
b.write() 

выход

{'foo': 123, 'asd': 'Test string'} 
{'foo': 124, 'asd': 'Test string'} 

Вот незначительные изменения:

class A(object): 
    def __init__(self): 
     self.asd = "Test string" 
     self.foo = 123 

    def write(self, d=None): 
     if d is None: 
      d = self.__dict__ 
     print d 

class B(A): 
    def __init__(self): 
     super(B, self).__init__() 
     self.parentkeys = self.__dict__.keys() 
     self.bar = 456 
     self.foo += 1 

    def write(self): 
     bdict = self.__dict__ 
     d = dict((k, bdict[k]) for k in self.parentkeys) 
     super(B, self).write(d) 

Однако, я чувствую, что может быть более Pythonic способ сделать what you really want to do ...

+0

Спасибо, я опишу фактическую проблему, которую я пытаюсь решить: Я использую библиотеку для обмена данными между C++, VHDL и SystemVerilog. Он использует кодегенераторы для создания структур данных, содержащих соответствующее поле. Подумайте о структуре данных типа c. Я хочу создать код python, содержащий функции datastructure и чтения/записи, чтобы установить и записать содержимое структуры данных из файла/в файл. – Maurice

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