将Python类方法作为多态函数



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

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

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

产生CCD_ 2。

到目前为止还不错。然而,f不适用于子类:

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 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()

最新更新