2011-01-20 87 views
1

我正在用ctypes封装一个大型的C库。 ctypesgen生成包装代码(我自己不怎么做)。作为包装C结构作为对象的ctypes的一部分,它们中的一些在C中具有“setter”,只是将它自己继承下来以便使用。这里有什么可能的危险?或者,这看起来可行,但感觉很可怕。或者,还有更好的方法?我不想修改ctypesgen生成的python。Python类是它自己的一个子类,这可以吗?陷阱?

class some_struct(ctypes.Structure): 
    _fields_ = [ ('a', ctypes.c_int), ('b', ctypes.c_double) ] 

再有就是交流功能set_some_struct_defaults()我他们实施这样:

class some_struct(some_struct): 
    def __init__(self): 
     set_some_struct_defaults(self) 

这样的想法是,“新” some_struct具有调用C“二传手”的初始化函数所以后来当我初始化一个Python对象我得到的所有默认值(这当然是很多比这个玩具例子比较复杂):

val = some_struct.some_struct() 

意见我有:

  • 导入的顺序现在很重要,如果从wrapping.py中导入some_struct,然后从扩展它的类中导入some_struct,那么顺序是错误的。不理想。
+0

AFAIK,应该工作。它不是继承自己*,它创建一个新类,然后给它一个相同的名字。但正如你所说,小心导入它。 – 2011-01-20 18:21:29

回答

2

您应该简单地通过指定some_struct一个新的__init__函数来执行此操作。

def new_init(self): 
    self._old_init() 
    set_some_struct_defaults(self) 

some_struct.__dict__["_old_init"] = some_struct.__init__ 
some_struct.__init__ = new_init 

这样做的好处是原始的__init__仍然被调用。

+0

你能解释一下原始`__init__`是如何被调用的吗? – 2011-01-20 16:37:35

0

如果你这样做,它会覆盖旧的类。如果你不打算使用父类,这将工作正常。当然,如果你从来没有用过老班级的话,那么改变原班级的方法会更有效率。

相关问题