用两个具有相同名称的方法创建类的任何方法,但一个是静态的,另一个是类方法

时间:2017-12-16 23:46:22

标签: python oop

class Socket:
    def __init__(self, ip, port, auto_connect=False):
        self.ip = ip
        self.port = port
        self.sockfd = socket.socket()
        if auto_connect:
           self.connect()

    @staticmethod
    def connect(sockfd, ip, port):
        sockfd.connect((ip, port))

    @nonstaticmethod
    def connect(self):
        self.sockfd.connect((self.ip, self.port))

与Dlang等其他语言类似,您可以在其中定义具有相同名称的函数;但是不同的签名,从而允许编译器区分不明确的函数调用所引用的函数。

我认为你可以以某种方式模仿属性,因为它们允许你在同一个函数上执行但使用不同的输入并接收不同的输出。但是因为@property标签不是Python,并且在C中重新创建它并不是非常可行的,也不是高效的工作方式;我正在寻求一种纯粹或第三方库的方法。

class Socket:
    def __init__(self, ip, port, auto_connect=False):
        self.ip = ip
        self.port = port
        self.sockfd = socket.socket()
        if auto_connect:
           self.connect()

    @staticmethod
    def static_connect(sockfd, ip, port):
        sockfd.connect((ip, port))

    def connect(self):
        self.sockfd.connect((self.ip, self.port))

我也认为你可以用不同的方式命名这些函数,但我不喜欢这种方法,因为它涉及用户知道辅助函数存在而且虽然合理,但不是我的风格。

我也向自己建议我可以按照以下方式做点什么:

类套接字:     ...     def connect(self,ip,port):         “””         静态使用时:             self = socket             ip = ip             port = port         当用作类成员时:             ip = ip& port = port         “”“

    if isinstance(self, types.ClassType):
        self.sockfd.connect((ip, port))
        return
    self.connect((ip, port))

但这只是不自然的,当有人阅读代码时会引起混淆,并且总体上是非战斗性的。

注意:此函数复制here中显示的行为,但它幸运地设法利用所有参数,因此不需要任何可选参数,所以道歉没有明确提及,但我的问题不要求用关键词参数做的方法。

TL; DR:

具有不同签名的类函数,例如:静态方法但不相互替换 - 但仍然可以适当调用

1 个答案:

答案 0 :(得分:0)

使用默认关键字参数的方法怎么样?

class Socket:
    def __init__(self, ip, port, auto_connect=False):
        self.ip = ip
        self.port = port
        self.sockfd = socket.socket()
        if auto_connect:
           self.connect()

    def connect(sockfd=self.sockfd, ip=self.ip, port=self.port):
        sockfd.connect((ip, port))

传递的参数将覆盖默认值,否则在不带参数的情况下调用将使用其默认参数。

这是一个适合你的解决方案吗?