我正在使用库在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”。
有没有办法只获取基类变量?我可以将基本字典与子类字典进行比较,只打印两者中出现的值,但这不是一种干净的方式。
答案 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 ......