如何判断多态层次结构中的哪个类包含我要调用的方法?

时间:2011-09-23 18:42:50

标签: python polymorphism introspection

如果我有:

class A():
    def f(self):
        print("running function, f from class A")
class B(A):
    def __init__(self):
        A.__init__(self)
    def f(self):
        print("running function, f from class B")

我创建了一个B类实例并在其上调用f,我们都知道我们会看到关于“来自B类”的消息。但有没有办法让我检查我的对象并确保我的子类覆盖了我的方法?类似的东西:

obj = B()
assert(not obj.f.livesIn(A))

2 个答案:

答案 0 :(得分:3)

class A():
    def f(self):
        print("running function, f from class A")
class B(A):
    def f(self):
        print("running function, f from class B")
class C(A):
    pass

这表明B.f不等于A.f。因此B必须覆盖f

obj = B()
print(obj.__class__.f == A.f)
# False

这表明C.f等于A.f。因此,C不得覆盖f

obj = C()
print(obj.__class__.f == A.f)
# True

答案 1 :(得分:1)

如果要强制子类覆盖,可以raise NotImplementedError()

也可以进行检查......我看到unutbu刚发布了一个例子,所以我不再重复了。 :)