自定义类是否可以实现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。