Python类是其自身的子类,可以吗?有什么陷阱?

1 投票
2 回答
562 浏览
提问于 2025-04-16 10:19

我正在用ctypes来封装一个很大的C库。ctypesgen生成了封装代码(和我自己做的差不多)。在ctypes的封装中,C结构体被当作对象来处理,其中一些在C中有“设置器”,这让我觉得可以直接继承这些结构体来使用。这样做有什么潜在的风险吗?或者这样做没问题,虽然看起来有点吓人?有没有更好的方法?我不想修改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)

我的想法是,“新的” some_struct有一个初始化函数,它会调用C的“设置器”,所以当我初始化一个Python对象时,就能得到所有的默认值(当然,这些默认值比这个简单的例子复杂得多):

val = some_struct.some_struct()

我观察到的一些情况:

  • 导入的顺序现在很重要,如果你先从wrapping.py导入some_struct,然后再从扩展它的类导入,一切都正常;但反过来就会出错。这并不是最理想的情况。

2 个回答

0

如果你这样做,会把旧的类给覆盖掉。如果你不打算使用父类,这样做是没问题的。当然,如果你根本就不打算用旧的类,那直接修改原来类的__init__方法会更有效率。

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__ 还是会被调用。

撰写回答