Python 如果可能的话,如何;“未绑定”;有界方法?

Python 如果可能的话,如何;“未绑定”;有界方法?,python,python-3.x,Python,Python 3.x,我有一个我不能修改的函数,因为它是第三方,可以说它是一个add函数 def add(a, b): print(a + b) 对于本例,让我们在init中调用它。它必须作为类变量分配给类。这样,它将自动成为一个有界方法。为了防止“绑定”,我需要用staticmethod来装饰它 class Base: func: Callable def __init__(self): self.func(a=1, b=2) class Working(Base):

我有一个我不能修改的函数,因为它是第三方,可以说它是一个
add
函数

def add(a, b):
    print(a + b)
对于本例,让我们在init中调用它。它必须作为类变量分配给类。这样,它将自动成为一个有界方法。为了防止“绑定”,我需要用
staticmethod
来装饰它

class Base:
    func: Callable

    def __init__(self):
        self.func(a=1, b=2)


class Working(Base):
    func = staticmethod(add)

它工作正常,因为没有将
self
传递给函数

def add(a, b):
    print(a + b)
我想知道是否可以在init中“解除绑定”/使其成为静态

class NotWorking(Base):
    func = add

    def __init__(self):
        staticmethod(self.func)(a=1, b=2)
它必须从
Base
类中可重用,因此我不需要反复重写相同的内容

class NotWorking2(Base):
    func = subtract
这不是我需要的东西,我只是想知道一旦它被绑定,是否有可能“解除绑定”

工作
类中,它只是一个函数

<function add at 0x7f1be89de1f0>
或者一个导致

TypeError: 'staticmethod' object is not callable
我见过,但它并没有真正回答我的问题


我认为这是不可能的,但是有没有更干净的方法,如果我有很多这样的类,那么只能调用一次
staticmethod

最简单的方法就是不要在
self
上将其作为方法调用:

class Base:
    func: typing.ClassVar[Callable]

    def __init__(self):
        type(self).func(a=1, b=2)

class NowWorking(Base):
    func = add

原始答复:

class NowWorking(Base):
    func = add

    def __init__(self):
        NowWorking.func(a=1, b=2)

最简单的方法就是不要在
self
上将其作为方法调用:

class Base:
    func: typing.ClassVar[Callable]

    def __init__(self):
        type(self).func(a=1, b=2)

class NowWorking(Base):
    func = add

原始答复:

class NowWorking(Base):
    func = add

    def __init__(self):
        NowWorking.func(a=1, b=2)

问题是我有很多这样的类,我的想法不是在
init
中做任何事情,而是将它添加到接口/abstractclass中-在这里,
Base
。你也可以调用
type(self).func
,我想这更灵活,我认为
Base.func
的类型应该是
typing.ClassVar[Callable]
func=type(self)。func
成功了。非常感谢。而且你的打字是对的。将在3分钟内接受。很高兴听到!我没有给出我最初的答案,因为我认为存在一个带有子类化的边缘情况,但我尝试了一下,效果很好。问题是我有很多这样的类,我的想法不是在
init
中做任何事情,而是将它添加到接口/抽象类中-这里,
Base
。你也可以调用
type(self.func
,我想这更灵活。顺便说一下,
Base.func
的类型应该是
typing.ClassVar[Callable]
func=type(self).func
成功了。谢谢!你的输入正确。3分钟后将接受。很高兴听到这个消息!我没有给出最初的答案,因为我认为存在带有子类化的边缘情况,但我尝试了一下,效果很好。