【问题标题】:Python: print base class variablesPython:打印基类变量
【发布时间】:2016-02-12 10:40:30
【问题描述】:

我正在使用一个库在 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: 测试字符串, foo: 124"

但它会产生

"asd: 测试字符串, bar: 456, foo: 124".

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

【问题讨论】:

  • B.write() 将如何工作,因为write 不是类方法?
  • FWIW,与其从 A 类派生 B 类,不如给 B 对象一个 A 对象作为属性可能更简洁、更简单。

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


【解决方案1】:

基类和子类变量之间没有区别。根据定义,继承是一种is-a关系;基类中定义的所有内容都如同子类中定义的一样。

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

做你想做的唯一方法是在输入A.__init__时记录密钥。

【讨论】:

    【解决方案2】:

    您说:“我可以将基本字典与子类字典进行比较,并且只打印两者中出现的值,但这感觉不是一种干净的方式”。你试图做的事情在 Python 中不是一件自然的事情,所以无论你做什么,它都不会是干净的。但实际上,您的建议是不可能的,因为当您在 B 实例中进行 .write 调用时,您无法获取基本字典。您可以做的最接近的做法是在 __init__ 调用 B 之后立即获取它的副本(或者,如 Daniel Roseman 所建议的,它的密钥),以便您以后需要时可以参考该副本。

    这里有一些代码可以做到这一点:

    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...

    【讨论】:

    • 谢谢,我将描述我正在尝试解决的实际问题:我正在使用库在 C++、VHDL 和 SystemVerilog 之间共享数据。它使用代码生成器来构建包含适当字段的数据结构。想想一个 c 类型的数据结构。我想生成包含数据结构和读/写函数的python代码,以设置数据结构的内容并将其从/写入文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2018-03-03
    • 1970-01-01
    相关资源
    最近更新 更多