存储对未绑定方法的引用

时间:2016-05-11 08:17:35

标签: python python-3.x

我试图存储对未绑定方法的引用,并注意到它正在自动绑定。见下面的例子。是否有更优雅的方法在类中存储未绑定的方法而不绑定它?

def unbound_method():
    print("YEAH!")

class A:
    bound_method = unbound_method
    unbound_methods = [unbound_method]


a = A()
a.unbound_methods[0]()  # succeeds

a.bound_method()        # fails
# TypeError: unbound_method() takes 0 positional arguments but 1 was given

这不是标准“你知道@staticmethod吗?”题。 我想要实现的是为班级的孩子提供另一种处理程序或某些情况的方法。我不控制unbound_method本身,它是从某个库提供的。

def unbound_method_a():
    print("YEAH!")

def unbound_method_b():
    print("WAY MORE YEAH!")

class A:
    bound_method = unbound_method_a

class B(A):
    bound_method = unbound_method_b

a = A()
a.bound_method() #fails
# print("YEAH!")
b = B()
b.bound_method() #fails
# print("WAY MORE YEAH!")

可以通过将未绑定方法包装成一些虚拟对象(如数组)或绑定方法来实现,只需删除自引用,如下所示:

def unbound_method_a():
    print("YEAH!")

def unbound_method_b():
    print("WAY MORE YEAH!")

class A:
    def call_unbound_method(self):
        return unbound_method_a()

class B(A):
    def call_unbound_method(self):
        return unbound_method_b()

a = A()
a.call_unbound_method()
# print("YEAH!")
b = B()
b.call_unbound_method()
# print("WAY MORE YEAH!")

1 个答案:

答案 0 :(得分:0)

据我所知。如果你只是替换

会不会这么糟糕
a.bound_method()

A.bound_method()

? 我无法想到第一个不能被第二个替换的情况。