我使用ctypes包装一个大型C库。 ctypesgen生成了包装代码(离我自己的方式不太远)。作为ctypes包装C语言结构的一部分被制作为对象,其中一些在C语言中具有“setter”,它们可以方便地将其自身子类化使用。这里有什么可能的危险?或者这很好,因为它似乎工作,但感到可怕。或者,还有更好的方法?我不想修改ctypesgen生成的python。
class some_struct(ctypes.Structure):
_fields_ = [ ('a', ctypes.c_int), ('b', ctypes.c_double) ]
然后有一个c函数set_some_struct_defaults(),我以这种方式实现:
class some_struct(some_struct):
def __init__(self):
set_some_struct_defaults(self)
所以我的想法是“new”some_struct有一个调用C“setter”的init函数,所以当我初始化一个python对象时,我得到所有默认值(当然比这个玩具复杂得多)示例):
val = some_struct.some_struct()
观察我:
答案 0 :(得分: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__
仍然会被调用。
答案 1 :(得分:0)
如果这样做,它将覆盖旧类。如果您不打算使用父类,这将正常工作。当然,如果你从不使用旧类,那么只更改原始类的__init__
方法会更有效。