将Pythonclass方法作为多态函数

Taking Python class method as a polymorphic function

编辑:这个问题是基于两个错误:最初不是在方法中包含 self 并且假设无界方法不会表现出多态性,但它们确实表现出多态性。我投票决定关闭它。

我可以在Python中将方法作为函数值对象:

class A:
    def foo(self):
        return "Hi, I'm A.foo"

f = A.foo
a = A()
print(f(a))

产生 Hi, I'm A.foo.

到目前为止一切顺利。但是,f 不适用于 sub-类:

class B(A):
    def foo(self):
        return "Hi, I'm B.foo"

f = A.foo
b = B()
f(b)

仍然生成 Hi, I'm A.foo,而 b.foo() 生成 Hi, I'm B.foo。换句话说,多态性不适用。

问题:有没有办法在 f 中获取函数值对象,以便 f(x) == x.foo() 每当 isinstance(x, A) 时?

换句话说,我如何完成下面的代码片段才能正常工作?

class A:
    def foo(self):
        return "Hi, I'm A.foo"

class B(A):
    def foo(self):
        return "Hi, I'm B.foo"

f = <WHAT DO I PUT HERE?>
a = A()
b = B()
assert f(a) == a.foo()
assert f(b) == b.foo()

您可以像这样拉出 class 名称:

class A:
    def foo(self):
        return "Hi, I'm {}.foo".format(self.__class__.__name__)

class B(A):
    def foo(self):
        return "Hi, I'm {}.foo".format(self.__class__.__name__)

f = A.foo  # this could be A or B, doesn't matter
a = A()
b = B()
assert f(a) == a.foo()
assert f(b) == b.foo()

请注意,因为 B 继承自 A,您甚至不需要那里的 foo 方法:

class A:
    def foo(self):
        return "Hi, I'm {}.foo".format(self.__class__.__name__)

class B(A):
    pass

f = A.foo
a = A()
b = B()
assert f(a) == a.foo()
assert f(b) == b.foo()