如何制作一个自定义python类来支持内存视图转换



自定义类是否可以实现memoryview(obj)

例如,

class A:
def __init__(self):
self.b = b'sdfajsdfjkasdf'
def __memoryview__(self):
return self.b

因此

a = A()
mv = memoryview(a) # returns the memoryview of a.b

是一个有效的操作。

在Python 3.12上,您将能够实现__buffer__:

class A:
def __init__(self):
self.b = b'sdfajsdfjkasdf'
def __buffer__(self, flags):
return self.b.__buffer__(flags)

则CCD_ 3将委派给CCD_ 4。(如果您的对象在释放缓冲区时需要执行任何清理,您也可以实现__release_buffer__。(

在3.12之前,没有支持。memoryview只接受支持缓冲协议的自变量,在3.12之前,缓冲协议仅为C。3.12之前没有Python级别的钩子。

在3.12之前,最接近定义内存视图转换的方法是定义一个类,子类一个具有缓冲区支持的现有类,但这将使您的对象实际上是该现有类的实例。例如,如果您使类成为bytes的子类,那么memoryview(a)将在对象上创建一个内存视图。它将而不是创建a.b的内存视图,并且会有各种通常不受欢迎的副作用。不要这样做只是为了提供内存视图支持;使用CCD_ 10。

相关内容

  • 没有找到相关文章

最新更新