谁能解释清楚Python中Buffer类和bytes以及bytearray之间的关系呀,如果是父子类关系又看不到继承关系,如果不是父子类关系,为什么声明参数类型为Buffer,却可以传入bytes对象的?

最近被Python的类型机制困扰了,指定方法参数类型为Buffer,却可以传入bytes对象,然而看代码他们之间好像又并没有父子关系,看了官网有关Buffer Protocol的说明,还是不明白这种差异在那里。以socket为例

import socket

client = socket.socket()
client.connect(("127.0.0.1", 8080))
# bytes对象
msg = bytes("hello world", "utf-8")
# send方法的参数声明为Buffer类型
client.send(msg)

可以看到这里send方法的参数其实是Buffer类型,传入的bytes对象是可以正常解析的

def send(self, __data: ReadableBuffer, __flags: int = ...) -> int: ...

而在bytes类中确实又看不到他们之间有父子类关系,希望有大佬能解答一下

讨论数量: 1
Jason990420

Where did you find it ?

def send(self, __data: ReadableBuffer, __flags: int = …) -> int:

On link docs.python.org/zh-cn/3/library/so..., it say

socket.send(bytes[, flags])

发送数据给套接字。本套接字必须已连接到远程套接字。可选参数 flags 的含义与上述 recv() 中的相同。本方法返回已发送的字节数。应用程序要负责检查所有数据是否已发送,如果仅传输了部分数据,程序需要自行尝试传输其余数据。有关该主题的更多信息,请参考 Socket 程式設計指南。

在 3.5 版的變更: 如果系统调用被中断,但信号处理程序没有触发异常,此方法现在会重试系统调用,而不是触发 InterruptedError 异常 (原因详见 PEP 475)。

2个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!