python:类实例无法看到self属性

时间:2016-02-29 18:21:47

标签: python ffi

在我的项目中,我使用module from known bt_manager来解码sbc音频流。这个模块是来自rtpsbc库的C函数的python包。

class SBCCodec:
    def __init__(self, config):

            import sys

            try:
                self.codec = ffi.verify(b'#include "rtpsbc.h"',
                                        libraries=[b'rtpsbc'],
                                        ext_package=b'rtpsbc')
            except:
                print 'Exception:', sys.exc_info()[0]

            self.config = ffi.new('sbc_t *')
            self.ts = ffi.new('unsigned int *', 0)
            self.seq_num = ffi.new('unsigned int *', 0)
            self._init_sbc_config(config)
            self.codec.sbc_init(self.config, 0)

当我尝试创建SBCCodec类实例时,它给了我:

AttributeError: SBCCodec instance has no attribute 'codec'

您可以在我上面发布的代码段中看到此属性。它适用于ffi-methods(ffi.verify,ffi.new)。当我在ipython中输入这些命令时,一切都正确无误。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

正如@Torxed已经提到过,这种情况发生的唯一方法是你的try块中的 ffi.verify 会引发异常。如果发生这种情况, self.codec 将不会被初始化。如果发生这种情况,您的代码不会重新抛出异常并在简单打印后继续正常(这不是干净的行为)。最后的语句然后尝试调用 self.codec.config.sbc_init ,也就是说它假定 self.codec 已经初始化,这在这种特殊情况下是不正确的这就是为什么你得到 AttibuteError

如果要创建实例,无论在init定义 self.codec =无 ffi.verify 失败,并在最终语句中插入支票如:

if (self.codec != None ):
   self.codec.sbc_init(self.config, 0)

希望有所帮助。