将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()
编辑:这个问题是基于两个错误:最初不是在方法中包含 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()