Python:打印基类变量

时间:2015-11-11 10:43:33

标签: python inheritance vhdl code-generation system-verilog

我正在使用库在C ++,VHDL和SystemVerilog之间共享数据。它使用代码生成器来构建包含适当字段的数据结构。想想一个c类型的数据结构。我想生成包含数据结构和读/写函数的python代码,用于设置数据结构的内容并将其从/写入文件。

为了做到这一点,我试图编写一个程序,用子类中的更新打印基类中的所有变量,但没有子类变量。

这个想法是A类是实际的VHDL / SystemVerilog / C ++记录/结构,B类包含处理和生成A类值的逻辑。

例如:

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:Test String,foo:124”

但相反它会产生

  

“asd:Test String,bar:456,foo:124”。

有没有办法只获取基类变量?我可以将基本字典与子类字典进行比较,只打印两者中出现的值,但这不是一种干净的方式。

2 个答案:

答案 0 :(得分:3)

基类和子类变量之间没有区别。根据定义,继承是一种关系;基类中定义的所有内容都好像是在子类中定义的。

同样,您在代码中任何其他位置定义的任何内容也将出现在dict中; Python不会限制您在类中的其他地方甚至从外部添加新的实例变量。

执行所需操作的唯一方法是在输入A.__init__时记录密钥。

答案 1 :(得分:1)

你说:“我可以将基本字典与子类字典进行比较,只打印两者中出现的值,但这不是一种干净的方式”。你想要做的事情在Python中并不是一件很自然的事情,所以无论你做什么,它都不会是干净的。但事实上,你建议的是不可能的,因为当你在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'} 之后立即拍下它的副本(或者,正如Daniel Roseman建议的那样,它的键),这样你可以在以后需要时参考该副本

以下是一些代码:

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)

<强>输出

if __name__ == '__main__':

这是一个小变化:

pod install

然而,我觉得可能有更多Pythonic方式https://gist.github.com/richpeck/2310ff3ab1ffcd6a9138 ......