首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用新属性扩展socket.socket

用新属性扩展socket.socket
EN

Stack Overflow用户
提问于 2017-07-20 06:58:01
回答 2查看 2.4K关注 0票数 10

我希望用一个新属性(特别是一个socket.socket,但可以是任何其他属性)扩展Python。我正试图决定是否应该使用继承或组合,但在某一时刻,我不知道如何解决这两个问题:

( A)如果我使用继承,其内容如下:

代码语言:javascript
复制
class MySocket(socket.socket):
    def __init__(self, *args, **kwargs):
        socket.socket.__init__(self, *args, **kwargs)
        self.queue = queue.Queue()

当我使用类似的操作时,我会遇到问题

代码语言:javascript
复制
connection, client_address = s.accept()

因为套接字的accept方法返回socket.socket类型的对象,而不是MySocket类型的对象,所以我不知道如何将其中一个转换为另一个。如果有一个琐碎的OOP方法来做这件事,我不知道。

( B)如果我用构图代替,以前的问题就会得到解决:

代码语言:javascript
复制
class MySocket(socket.socket):
    def __init__(self, true_socket):
        self.true_socket = true_socket
        self.queue = queue.Queue()

我只需要简单地实现这样的东西

代码语言:javascript
复制
def accept(self, *args, **kwargs):
    con, cli = socket.socket.accept(self, *args, **kwargs)
    return self.__class__(con), cli

但我还有另一个问题。当我需要做的时候

代码语言:javascript
复制
readable, writable, exceptional = select.select(inputs, outputs, inputs)

selectsocket.socket工作。对于A)版本,我希望它能像现在一样工作,但是对于组合,既然MySockets不是socket.socket的实例,select就坏了。

那么,什么是最好的,丙酮主义的方法呢?

编辑:我忘记说我尝试的第一件事是直接将属性添加到`socket.Socket‘的实例中:

代码语言:javascript
复制
s = socket.socket(...)
s.queue = queue.Queue()

但我得到了一个异常,该属性对于“socket.Socket”来说是未知的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-20 08:52:59

您可以根据socket.socket.dup()Lib/socket.py中使用以下内容

代码语言:javascript
复制
    import _socket

    class MySocket(socket.socket):
        def __init__(self, *args, **kwargs):
            super(MySocket, self).__init__(*args, **kwargs)
            self.queue = queue.Queue

        @classmethod
        def copy(cls, sock):
            fd = _socket.dup(sock.fileno())
            copy = cls(sock.family, sock.type, sock.proto, fileno=fd)
            copy.settimeout(sock.gettimeout())
            return copy

现在可以使用构造函数创建新的MySocket,也可以使用MySocket.copy()从现有的socket.socket创建MySocket。注意,在大多数情况下,您应该在创建副本之后关闭原始套接字。

票数 8
EN

Stack Overflow用户

发布于 2017-07-20 07:10:15

也许您应该尝试使用super进行继承

代码语言:javascript
复制
class NewSocket(socket.socket):
    def __init__(self):
        super(NewSocket, self).__init__()
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45207430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档