1

我想首先说我知道new.instancemethod在 python 3 中不存在重载函数在技术上也不存在。

但是,我正在查看一个旧的 python 包,它new.instancemethod在有效允许overloaded functions.

尽管我已经包含了我认为是下面相关部分的内容,但可以从这个站点找到具体的包。

我正在使用 python 3,所以我需要将其转换为 python 3 的可用脚本。我已经使用了 2to3 工具并已经查看了大部分更改。但是,我被困在下面,我无法弄清楚要替换什么new.instancemethod

class overloaded:
    ...

    def __get__(self, obj, type=None):
        if obj is None:
            return self
        return new.instancemethod(self, obj)

重载的类在前面__init__用作装饰器,这没有问题,但是当它在方法前面使用时,它是一个问题,因为obj不再是None.

我需要这个的原因是因为 a) 它很有用 b) 因为我目前正在将过时的 IbPy 包从 2.56 转换为 3.x。IbPy包基本上是Interactive Brokers的Java API翻译成Python。

@overloaded 放在前面的主要方法如下:

@overloaded
@synchronized(mlock)
def eConnect(self, host, port, clientId):
    host = self.checkConnected(host)
    if host is None:
        return
    try:
        socket = Socket(host, port)
        self.eConnect(socket, clientId)
    except Exception as e:
        self.eDisconnect()
        self.connectionError()

请注意,@synchronize 只是一个强制同步多个函数的装饰器。代码很短,可以在这里找到,尽管我认为它与我的问题无关。

那么经过这么长的解释,我如何return new.instancemethod(self, obj)才能看起来更像 python 3?尽管昨晚和今天早上都阅读了这件事,但我似乎无法理解正在发生的事情。我已经尝试了很多事情,我想我只是缺乏对如何处理这个问题的理解。

任何建议将不胜感激。谢谢!

4

1 回答 1

1

types.MethodType应该使用而不是 new.instancemethod

或者您可以从任何类获取 instancemethod:

instancemethod = type(Anyclass.method)

其中 method 是任何类方法

向现有对象实例添加方法

于 2013-04-28T19:45:22.587 回答