gpt4 book ai didi

Python 类是其自身的子类,这样可以吗?陷阱?

转载 作者:行者123 更新时间:2023-12-01 06:13:01 27 4
gpt4 key购买 nike

我正在使用 ctypes 包装一个大型 C 库。 ctypesgen生成了包装代码(与我自己的做法相差不远)。作为包装 C 结构的 ctypes 的一部分,它们被制作为对象,其中一些在 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)

所以这个想法是“新的”some_struct 有一个 init 函数来调用 C“setter”,所以当我初始化一个 python 对象时,我得到了所有的默认值(这当然比这个玩具复杂得多)示例):

val = some_struct.some_struct()

我的观察:

  • 导入的顺序现在很重要,如果您从wrapping.py导入some_struct,然后从扩展它的类导入,那么一切都很好,否则会出现错误。不太理想。

最佳答案

您应该简单地通过为 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__ 仍然会被调用。

关于Python 类是其自身的子类,这样可以吗?陷阱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4749360/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com