Python类本身就是一个子类,这样可以吗?陷阱?

时间:2011-01-20 15:58:06

标签: python ctypes

我使用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()

观察我:

  • 导入的顺序现在很重要,如果你从wrapping.py导入some_struct,然后从扩展它的类中导入一切都很好,另一个顺序是错误。不理想。

2 个答案:

答案 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__方法会更有效。