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

Python类本身就是一个子类,这样可以吗?陷阱?,python,ctypes,Python,Ctypes,我正在使用ctypes包装一个大型C库。生成包装代码(与我自己的做法相差不远)。作为包装C结构的ctypes的一部分,它们中的一些在C中有“setter”,这对于使用子类本身很方便。这里可能有什么危险?或者这样做很好,因为它看起来很有效,但感觉很可怕。还是有更好的办法?我不想修改ctypesgen生成的python class some_struct(ctypes.Structure): _fields_ = [ ('a', ctypes.c_int), ('b', ctypes.c_d

我正在使用ctypes包装一个大型C库。生成包装代码(与我自己的做法相差不远)。作为包装C结构的ctypes的一部分,它们中的一些在C中有“setter”,这对于使用子类本身很方便。这里可能有什么危险?或者这样做很好,因为它看起来很有效,但感觉很可怕。还是有更好的办法?我不想修改ctypesgen生成的python

class some_struct(ctypes.Structure):
    _fields_ = [ ('a', ctypes.c_int), ('b', ctypes.c_double) ]
然后有一个c函数集_some _struct _defaults(),我用这种方式实现它:

class some_struct(some_struct):
     def __init__(self):
         set_some_struct_defaults(self)
其思想是“new”some_struct有一个调用C“setter”的init函数,因此当我初始化python对象时,我得到了所有的默认值(当然比这个玩具示例复杂得多):

我的观察结果如下:

  • 导入的顺序现在很重要,如果您从wrapping.py以及以后从扩展它的类中导入某些_结构,那么其他顺序都是错误的。不理想

您只需分配
一些结构
一个新的
初始化
函数即可

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

这样做的好处是,仍然会调用原始的
\uuuu init\uuuu

如果这样做,它将覆盖旧类。如果您不打算使用父类,这将很好地工作。当然,如果你从不使用旧类,只需更改原始类的
\uuuuu init\uuuu
方法会更有效。

你能解释一下原始的
\uuu init\uuuu
是如何被调用的吗?@Brian Larsen:它将旧的
\uuu init\uuu
存储在
并在新的
\uuuuu init\uuuu
AFAIK中调用它,这应该可以工作。它不是子类化自己,而是创建一个新类,然后给它起相同的名字。但正如你所说,在导入时要小心。
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